[英]Get the execution time of a ADO.NET SQL Command
我一直在尋找是否有任何簡單的方法來獲取ADO.NET命令對象的執行時間。
我知道我可以手動執行StopWatch啟動和停止。 但是想要在ADO.NET中有任何簡單的方法
有一種方法,但使用SqlConnection
,而不是命令對象。 例:
using (var c = new SqlConnection(connectionString)) {
// important
c.StatisticsEnabled = true;
c.Open();
using (var cmd = new SqlCommand("select * from Error", c)) {
cmd.ExecuteReader().Dispose();
}
var stats = c.RetrieveStatistics();
var firstCommandExecutionTimeInMs = (long) stats["ExecutionTime"];
// reset for next command
c.ResetStatistics();
using (var cmd = new SqlCommand("select * from Code", c))
{
cmd.ExecuteReader().Dispose();
}
stats = c.RetrieveStatistics();
var secondCommandExecutionTimeInMs = (long)stats["ExecutionTime"];
}
在這里,您可以找到RetrieveStatistics
返回的字典中包含的其他值。
請注意,這些值代表客戶端統計(基本上是ADO.NET的內部測量),但似乎你要求使用Stopwatch
模擬 - 我認為這很好。
來自@Evk答案的方法非常有趣和聰明:它是工作客戶端,這種統計的主要關鍵之一實際上是NetworkServerTime
,
返回應用程序開始使用提供程序並啟用統計信息后,提供程序等待服務器回復所花費的累計時間(以毫秒為單位)。
所以它包括從數據庫服務器到ADO NET客戶端的網絡時間。
另一種更面向DB 服務器的方法是運行SET STATISTICS TIME ON
,然后檢索InfoMessage
。
委托代碼的草稿(我只是寫入調試控制台,但您可能希望用StringBuilder
Append
替換它)
internal static void TrackInfo(object sender, SqlInfoMessageEventArgs e)
{
Debug.WriteLine(e.Message);
foreach (var element in e.Errors) {
Debug.WriteLine(element.ToString());
}
}
和用法
conn.InfoMessage += TrackInfo;
using (var cmd = new SqlCommand(@"SET STATISTICS TIME ON", conn)) {
cmd.ExecuteNonQuery();
}
using (var cmd = new SqlCommand(yourQuery, conn)) {
var RD = cmd.ExecuteReader();
while (RD.Read()) {
// read the columns
}
}
我建議您轉到SQL Server 2016並使用查詢存儲功能。 這將跟蹤您提交的每個查詢的執行時間和性能隨時間的變化。 不需要更改您的應用程序。 跟蹤所有查詢,包括在存儲過程中執行的查詢。 跟蹤任何應用程序,而不僅僅是您自己的 適用於所有版本,包括Express,包括Azure SQL DB服務。
如果您在客戶端進行跟蹤,則必須使用掛鍾自行測量時間。 我會添加並公開性能計數器 ,然后使用性能計數器基礎結構來捕獲和存儲測量值。
作為一個方面,僅僅跟蹤發送到SQL Server的批處理的執行時間會產生非常粗糙的性能信息,並且很少可操作。 閱讀如何分析SQL Server性能 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.