为什么ExecuteScalar第一次通话需要时间?

时间:2015-12-01 14:35:17

标签: c# sql-server-2008

以下是我测量ExecuteScalar多次迭代所用时间的程序。

static void Main(string[] args)
{
    string sqlConnectionString = "Data Source=.\\SQLEXPRESS;Initial Catalog=Test;Integrated Security=True";
    SqlConnection connection = new SqlConnection(sqlConnectionString);
    for(int i=0; i <4; i++){
        Stopwatch stopWatch = new Stopwatch();

        string sqlCommand = "Insert into TestTable (SNO, Name) values (" + i + ",' " + i + "')";
        SqlCommand command = new SqlCommand(sqlCommand, connection);
        connection.Open();
        stopWatch.Start();
        var result = command.ExecuteScalar();
        stopWatch.Stop();
        connection.Close();
        Console.WriteLine("Time elapsed to insert row " + i + " : " + stopWatch.ElapsedMilliseconds);
    }
    Console.ReadKey();
}

输出:

Time elapsed to insert row 0 : 3
Time elapsed to insert row 1 : 1
Time elapsed to insert row 2 : 0
Time elapsed to insert row 3 : 0

我的问题是为什么第一次迭代需要3毫秒,而剩下的则少于此。

提前致谢。

3 个答案:

答案 0 :(得分:2)

这是由于连接池。一旦建立连接(无论是否关闭它),只要连接字符串保持不变,就会汇集连接,这会导致连续执行更快。

答案 1 :(得分:1)

最有可能建立的连接并非真正关闭,而是返回到连接池并在下一次迭代中重用。

通常,您也可以考虑从DBMS中查询计划缓存和实际数据缓存,但在这种情况下,这不会真正适用于INSERT操作(仍然,在第一次迭代期间,它的必要元数据可能会很冷) )。

答案 2 :(得分:1)

首先,您应该使用undef方法。现在谈论时间;第一次它必须建立连接,然后执行查询,但对于后来的迭代,情况不再是这样。