Sql-Server
衡量查詢優化效果的最佳程序?
對於以下問題,我找不到有價值的答案或解釋:
測試查詢改進效果的程序應該是什麼樣的?使用 SSMS 我不確定這些步驟。
目前我執行以下操作:
- 將生產數據庫恢復到隔離的測試伺服器,以切斷通過額外的伺服器使用來偽造結果的外部影響/使用。
- 重建所有索引和統計資訊。
然後我重複執行以下步驟:
SET STATISTICS IO ON
- 獲取有關 IO 使用情況的資訊DBCC FREEPROCCACHE; CHECKPOINT;
- 釋放計劃記憶體並在重複/測試更改時考慮例如索引更改DBCC DROPCLEANBUFFERS;
- 避免使用記憶體數據以確保我對每個查詢執行進行公平比較- 執行查詢
每次執行後,我快速將所有統計輸出導入到 Excel 表中,以比較對原始數據的更改(見圖)以及執行時,檢查返回的行數是否仍與原始數據匹配並檢查新的執行計劃以查看效果。
不幸的是,這個過程需要很多時間,因為每次執行清除記憶體需要大約 15 分鐘才能完成。
- 這個程序很好還是我應該考慮改變?
- 清除數據記憶體真的有必要嗎,還是因為沒有其他活動使用者可以更改該記憶體,所以使用數據記憶體執行查詢仍然是一個公平的比較?
冒著陳述顯而易見的風險,首先確定您要優化的內容。幾乎總是經過時間,儘管您可能正在嘗試減少 CPU 使用(以減少許可證費用)或 IO(例如,為了避免磁碟升級)。然後找到一種方法來測量那個東西,保持其他變數不變。確保您選擇的衡量標準實際上衡量的是您的目標,而不是一堆其他東西。
例如,在 SSMS 中執行查詢並查看狀態欄執行時間將顯示往返網路時間加上計劃編譯時間加上 IO 時間加上查詢執行時間加上客戶端記憶體時間加上 SSMS 渲染時間。對於大型結果集和慢速網路,成本和可變性可能會淹沒任何實際改進。
每次迭代都有一個完全乾淨的緩衝池和計劃記憶體將提供很好的可重複性。然而,這不太可能是實際的生產場景。由於生產是您要快速實現的目標,因此我建議您在類似生產的環境中進行測試,該環境具有類似的記憶體和磁碟、已編譯的計劃以及緩衝池中的工作集。