2010-09-21 101 views
17

如何比較兩個查詢X和Y,並說X比Y更好,當它們在小型情況下幾乎同時進行時?如何比較兩個查詢?

問題是,我有兩個查詢應該運行在一個非常大的數據庫,所以運行和評估不是一個完全可行的選擇。因此,我們創建了一個小型數據庫來執行一些測試。評估哪個查詢更好是一個問題,因爲在我們的測試基礎上,它們幾乎在同一時間運行(大約5分鐘)。除了返回的時間之外,還有什麼方法可以衡量查詢的質量?

+0

嗨,我只是把這個問題MSSQL – User7354632781 2010-09-21 20:08:46

回答

26
SET STATISTICS IO ON 
SET STATISTICS TIME ON 

運行查詢並比較各種表和執行時間的邏輯讀取。

+8

@CombatCaptain你也可以將比較查詢一起堆放在SSMS中,然後按'CTRL + M'(包括實際執行計劃),然後按'F5'。然後將鼠標懸停在「實際執行計劃」選項卡中的第一個節點上,並閱讀「估計的子樹成本」。 – 2010-09-21 20:55:57

+2

這些聲明似乎不被普遍支持。錯誤[15001]語句錯誤發生在或之前:SET STATISTICS IO ON – dokaspar 2012-08-22 12:35:01

2

您是否檢查過查詢計劃?如果查詢返回相同的數據並且執行的時間相同,則我的猜測是查詢計劃幾乎相同,這意味着兩個查詢之間沒有任何有意義的區別。

另外,您是否考慮到查詢在數據庫大小更改方面的性能不同?

我想知道你是否過早地優化代碼。在我看來,如果我的查詢有效且可以理解,我可以通過索引來解決性能問題。這通常比改變查詢來提高性能更簡單。

3

如前所述,請檢查執行計劃。

重要的是,通過在每次運行之間清除緩存來公平地比較2個查詢,以確保您沒有看到由於數據已被緩存(不在生產​​服務器上運行)的影響而導致的歪斜結果:

DBCC DROPCLEANBUFFERS -- clear proc plan cache 
DBCC FREEPROCCACHE -- clear data cache 

然後我通常會做的是檢查讀取,寫入,CPU和持續時間進行比較。

使用生產級別的數據捲進行測試非常重要(理想情況下可以查看它的縮放比例)。在這些捲上,你會看到任何性能差異。使用小數據量進行測試可能會在稍後出現問題。

0

在顯着不同的數據集上評估查詢性能通常意義不大。查詢計劃及其效率可能因數據統計數據而大不相同。所以爲了得到任何現實的估計,你需要一個儘可能接近「真實」的數據庫。最重要的是,拿一份你的「大數據庫」並調整你的查詢。