这里对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,做学问不能想当然,数据出真知。
(责任编辑:admin) |