这里对Command对象传递参数的效率进行了测试,大家可以比较一下分个高低。
在.net平台,普通的insert语句有两种写法,不带参数insert into test(c1,c2) values(var1,var2)和带参数insert into test(c1,c2) values(:c1,:c2),它们的执行效率如何呢?
两者是否类似,带参数只是类似占位符的功能,有人说传递参数类似java中的预编译功能,可以有效提高运行效率。
我们这里做了个试验,代码如下:
Code
public partial class WebForm1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//test1();
test2();
}
private void test1()
{
OracleConnection con = new OracleConnection();
con.ConnectionString = "Data Source=oracl;User Id=xxx;Password=xxx;Persist Security Info=True;";
System.Random r = new Random((int)System.DateTime.Now.Ticks);
string strCommand = "insert into test(c1,c2) values({0},{1})";
OracleCommand com = new OracleCommand();
com.Connection = con;
con.Open();
DateTime dt = DateTime.Now;
Label1.Text = "不传参:"+DateTime.Now.ToLongTimeString();
for (int i = 0; i < 50000; i++)
{
com.CommandText = string.Format(strCommand, r.Next(), r.Next());
com.ExecuteNonQuery();
}
com.CommandText = "truncate table test";
com.ExecuteNonQuery();
con.Close();
Label2.Text = DateTime.Now.ToLongTimeString();
}
private void test2()
{
OracleConnection con = new OracleConnection();
con.ConnectionString = "Data Source=bocodb;User Id=hljyd;Password=hljyd;Persist Security Info=True;";
System.Random r = new Random((int)System.DateTime.Now.Ticks);
string strCommand = "insert into test(c1,c2) values(:c1,:c2)";
OracleCommand com = new OracleCommand();
com.Parameters.Add(":c1", OracleType.Number);
com.Parameters.Add(":c2", OracleType.Number);
com.CommandText = strCommand;
com.Connection = con;
con.Open();
Label1.Text = "传参:"+DateTime.Now.ToLongTimeString();
for (int i = 0; i < 50000; i++)
{
com.Parameters[":c1"].Value = r.Next();
com.Parameters[":c2"].Value = r.Next();
com.ExecuteNonQuery();
}
com.Parameters.Clear();
com.CommandText = "truncate table test";
com.ExecuteNonQuery();
con.Close();
Label2.Text = DateTime.Now.ToLongTimeString();
}
}
执行结果:
10000记录:
不传参数?5:46:19 15:46:34 15秒
传参数:?5:50:51 15:51:01 10秒
50000记录:
不传参数 16:09:03 16:10:24 81秒
传参数::16:15:43 16:16:36 53秒
这只是2个参数的情况,如果参数很多会不会影响更大呢?
10000记录,7个参数:
不传参数:17:11:01 17:11:18 17秒
传参数:17:13:46 17:13:59 13秒
50000记录:7个参数:
不传参数:17:19:02 17:20:25 1分23秒
传参数:17:15:09 17:16:10 1分1秒
居然差距不大。
总结:1,向command对象传递参数既可以避免sql注入问题,也可以提高性能;
2,做学问不能想当然,数据出真知。