2010-08-01 86 views
0

我需要一些幫助來解釋SQL Server 2008中的這種行爲。我有一個簡單的C++程序在循環中運行查詢。這是程序的僞代碼。SQL Server查詢隨着時間的推移從0降低到60毫秒

myTempid = 0; 

while (1) { 
    execQuery(select a.id 
      from a,b,c,d 
      where a.id = b.id 
       and b.id = c.id 
       and c.id = d.id 
       and id.id = myTempID) 
} 

這裏有一些事實

  1. A,B,C都是空表
  2. d具有約5500行

查詢開始時採取 '0msec'(我可以從分析器中看到這一點);但是在X次迭代之後;它跳到約60毫秒並停留在那裏。 X是變體;有時是100 ..有時是200.奇怪的是,一旦它從0跳到60毫秒,無論myID如何,它都會停留在那裏。

對我來說,聽起來像SQL Server是以某種方式'去緩存'的查詢計劃?這對任何人都有意義嗎

謝謝!

+0

什麼是id.id? 你確定在execQuery例程中沒有內存或連接泄漏嗎? – Jacob 2010-08-01 02:50:51

+0

您是在SQL服務器上還是在您的應用中計時執行?如果在你的應用程序中,這可能會打開連接或打開一個最大值。 – Bill 2010-08-01 03:50:30

+0

可能是參數嗅探:http://www.sqlpointers.com/2006/11/parameter-sniffing-stored-procedures.html – 2010-08-01 03:59:33

回答

4

來自SQL事件探查器的結果可能會很難理解。

顯示的命令時間包括記錄集傳遞給客戶端的時間。爲了看到這個,創建一個返回至少一百萬行的SELECT語句。運行這些測試是SQL Management Studio並運行SQL Profiler來跟蹤結果。

首先運行,將SQL結果發送到一個臨時表(應該需要一秒左右)。第二次運行,將SQL結果發送到結果窗口(應該需要幾秒鐘)。請注意SSMS中顯示的運行時間。然後記下SQL Profiler報告的時間。

您應該看到SSMS讀取記錄集,格式化結果並將它們顯示到「結果」窗口的時間會增加爲查詢報告的持續時間。

畢竟,我說當你從你的應用程序運行查詢時,在這個精確度級別(60毫秒)下,你無法判斷數據庫,網絡或應用程序的降速來自哪裏,只是從報告的持續時間。

您應該創建一個測試腳本並在SSMS中運行查詢,查看當您的應用程序不是循環的一部分時查詢時間是否會降低。

SQL事件探查器2008以微秒記錄持續時間,但僅以毫秒顯示;所以舍入是一個問題。將跟蹤保存爲跟蹤表並查看「持續時間」列中的結果以查看微秒。如果問題出在SQL Server中,您可能會看到持續時間在增加。

您還可以讓Profiler返回執行計劃。您可以在持續時間增加之前和之後查看執行計劃,並查看執行計劃是否正在改變。

相關問題