2010-11-13 58 views
0

當我運行一個從Sql管理工具中返回數百萬行的查詢時,它看起來像查詢立即執行。據我所知,幾乎沒有執行時間。什麼使查詢花費時間完成是返回所有行。 這讓我覺得我做得很好!但速度並不快......當我在分析器工具中查看查詢時,它指出查詢使用了7600 CPU。持續時間爲15000.如何將執行時間與運行和返回行所花費的總時間區分開來?

我不知道我知道如何解釋這些統計。 一方面,查詢似乎運行得很快,但探查器報告讓我覺得不然。如何在Mgmt Tools中立即執行查詢?據我所知,顯然應該有某種延遲執行:至少7600毫秒。當我在mgmt工具中運行查詢以完成查詢時,我必須等待比CPU和持續時間統計更長的時間。

回答

3

它看起來像查詢立即執行 這可能是查詢計劃允許開始快速返回行。
例如,如果您執行SELECT * FROM a_large_table,您將立即看到一些行,但檢索整個結果集需要一些時間。 Mgmt Studio報告的實際執行時間是多少(查詢完成後顯示在狀態欄中)?

如果要在不向客戶端檢索數據的情況下測試查詢性能,可以執行SELECT INTO #temp_table。這將需要一些額外的I/O,但仍會給你一個相當好的執行時間估計。

UPD。
你也可以運行諸如SELECT COUNT(*) FROM (<your query here>)SELECT SUM(<some field>) FROM (<your query here>)之類的東西 - 運氣好的話,它會使服務器執行查詢並聚合結果,基本上做同樣的工作再加上一點額外的東西。但以這種方式扭曲結果是非常容易的 - 查詢優化器很聰明,並且需要非常小心以確保測量您想要測量的結果(因爲使用不同的執行計劃來測量查詢根本沒有意義)。

我建議你再考慮一下你想測量什麼以及爲什麼。在任何真實場景中,對「純」查詢持續時間不感興趣 - 因爲您永遠不想丟棄查詢結果(結果就是您爲什麼首先需要查詢,對吧?)。因此,您需要將結果返回給客戶端,或者將其存儲在某個地方,或者將其與另一個表等結合起來 - 通常您需要測量查詢執行情況,包括處理結果的時間。

最後一個通知。如果你希望你能以某種方式迫使服務器在1秒內執行這個查詢,因爲你認爲服務器在其他13秒內什麼都不做,你錯了。就像他們說的那樣,SELECT沒有被破壞。
有什麼可以幫助查詢優化 - 對於單個查詢分析器不會幫你太多。分析查詢計劃,調整您的表結構,嘗試重寫查詢,如果遇到麻煩,請在SO上發佈另一個問題。

+0

管理工具報告查詢花了14秒,但正如我所說我可以立即滾動reults視圖。有沒有其他方法可以測試這個,而不寫入臨時表? – 2010-11-19 18:11:23

+0

這絕對意味着整個查詢需要14秒,但您看到的行會更快地返回。如果不查看查詢計劃和數據,很難詳細解釋這一點,但這種行爲絕不意外。 – VladV 2010-11-20 21:10:57

+2

爲避免混淆「SELECT INTO」或向查詢添加假集合,SSMS中有一個選項「執行後放棄結果」 – 2010-11-20 21:35:09

相關問題