为什么ExecuteScalar第一次调用需要时间

本文关键字:时间 调用 ExecuteScalar 第一次 为什么 | 更新日期: 2023-09-27 18:25:10

下面是我的程序,用于测量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毫秒,而剩下的迭代要短于此。

提前谢谢。

为什么ExecuteScalar第一次调用需要时间

这是由于连接池。一旦建立了连接(无论是否关闭),只要连接字符串保持不变,连接就会被池化,从而更快地连续执行。

很可能是连接的建立,它并没有在关闭时真正结束,而是返回到连接池,并在下一次迭代中重复使用。

通常,您还可以考虑查询计划缓存和DBMS的实际数据缓存,但在这种情况下,这并不真正适用于INSERT操作(尽管如此,在第一次迭代期间,它所需的元数据可能是冷的)。

首先应该使用ExecuteNonQuery()方法。现在谈谈时间;第一次它必须建立连接,然后执行查询,但对于以后的迭代,情况不再如此。