2015-12-01 49 views
1

下面是我的程序來衡量ExecuteScalar多次迭代所用的時間。爲什麼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毫秒的第一次迭代和其餘它比較小。

在此先感謝。

+2

[SQL Server連接池](https://msdn.microsoft.com/en-us/library/8xx3tyca(v = vs.110).aspx) - 第一次有'connection.Open',它真的必須建立一個真正的連接到服務器。在後續運行中,它可能會再次獲取相同的連接。 –

+1

2毫秒的差距真的很重要嗎?也許是因爲連接池? –

+0

除了不太精確的測量方法 - 可能有多種原因會導致這種情況發生。例如,sql連接僅在第一次創建,而其他時間則從連接池中創建。 –

回答

1

最有可能建立的連接並不是真的在關閉時結束,而是返回到連接池並在下一次迭代中重用。通常,您可能還會考慮DBMS中的查詢計劃緩存和實際數據緩存,但在這種情況下,它並不會真正適用於INSERT操作(儘管如此,必要的元數據可能會在第一次迭代)。

1

首先,您應該使用ExecuteNonQuery()方法。現在談論時間;第一次必須建立連接,然後執行查詢,但是對於後面的迭代來說,情況不再是這樣。

2

這是由於連接池。一旦建立連接(無論是否關閉),只要連接字符串保持不變,連接就會集中起來,從而導致連續執行更快。

相關問題