位置:海鸟网 > IT > ASP.NET >

Command对象传递参数效率测试

这里对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,做学问不能想当然,数据出真知。