查詢(xún)調優(yōu)通常是加速SQL服務(wù)器性能的最快方法。大多數情況下,系統級服務(wù)器性能(內存、處理器等)改進(jìn)措施既無(wú)效又昂貴。專(zhuān)家開(kāi)發(fā)人員認為,大多數性能問(wèn)題都可以追溯到編寫(xiě)不當的查詢(xún)和低效的索引,而不是硬件限制。事實(shí)上,有些性能問(wèn)題只能通過(guò)查詢(xún)調優(yōu)來(lái)解決。
但是當涉及到SQL服務(wù)器性能查詢(xún)調優(yōu)時(shí),DBA 經(jīng)常會(huì )遇到從哪里開(kāi)始的問(wèn)題。您如何評估查詢(xún)?您如何發(fā)現查詢(xún)編寫(xiě)方式中的缺陷?您如何發(fā)現隱藏的改進(jìn)機會(huì )?查詢(xún)優(yōu)化一半是科學(xué),一半是藝術(shù),因為沒(méi)有正確或錯誤的答案,只有最適合給定情況的解決方案。
這里有 12 個(gè)快速提示,可以幫助 DBA 以可衡量的方式提高查詢(xún)性能,同時(shí)確保特定更改確實(shí)提高了查詢(xún)速度。
1. 基本查詢(xún)分析
DBA 需要了解所有層和有關(guān)昂貴查詢(xún)的信息,以便隔離根本原因。有效的調優(yōu)需要了解排名靠前的 SQL 語(yǔ)句、排名靠前的等待類(lèi)型、SQL 計劃、阻塞的查詢(xún)、資源爭用以及缺少索引的影響。從基礎開(kāi)始——在你投入之前準確地了解你正在處理的是什么會(huì )有所幫助。
提示 1:了解您的表和行數
首先,確保您實(shí)際操作的是表,而不是視圖或表值函數。表值函數有其自身的性能影響。您可以使用 SSMS 將鼠標懸停在查詢(xún)元素上以檢查這些詳細信息。通過(guò)查詢(xún) DMV 檢查行數。
技巧 2:檢查查詢(xún)過(guò)濾器、WHERE 和 JOIN 子句并注意過(guò)濾的行數
如果沒(méi)有過(guò)濾器,并且返回了大部分表,請考慮是否需要所有數據。如果根本沒(méi)有過(guò)濾器,這可能是一個(gè)危險信號,需要進(jìn)一步調查。這確實(shí)會(huì )減慢查詢(xún)速度。
技巧 3:了解表格的選擇性
根據前兩個(gè)技巧中的表格和過(guò)濾器,了解您將使用多少行,或實(shí)際邏輯集的大小。我們建議使用 SQL 圖表作為評估查詢(xún)和查詢(xún)選擇性的強大工具。
技巧 4:分析額外的查詢(xún)列
仔細檢查 SELECT * 或標量函數以確定是否涉及額外的列。您帶回的列越多,使用某些索引操作的執行計劃可能變得越不理想,而這反過(guò)來(lái)又會(huì )降低性能。
2.高級查詢(xún)分析
提示 5:了解和使用約束會(huì )有所幫助
了解和使用約束會(huì )在您開(kāi)始調優(yōu)時(shí)有所幫助。查看現有的鍵、約束、索引,以確保避免重復工作或與已存在的索引重疊。要獲取有關(guān)索引的信息,請運行 sp_helpindex 存儲過(guò)程:
技巧 6:檢查實(shí)際執行計劃(而非估計計劃)
估計計劃使用估計統計信息來(lái)確定估計行;實(shí)際計劃在運行時(shí)使用實(shí)際統計信息。如果實(shí)際計劃和估計計劃不同,您可能需要進(jìn)一步調查。
技巧 7:記錄您的結果,重點(diǎn)關(guān)注邏輯 I/O 的數量
如果您不記錄結果,您將無(wú)法確定更改的真正影響。
提示 8:根據您的發(fā)現調整查詢(xún)并一次進(jìn)行小的、單一的更改一次
進(jìn)行過(guò)多的更改可能是無(wú)效的,因為它們會(huì )相互抵消!首先尋找最昂貴的操作。沒(méi)有正確或錯誤的答案,只有最適合給定情況的答案。
技巧 9:重新運行查詢(xún)并記錄所做更改的結果
如果您發(fā)現邏輯 I/O 有所改進(jìn),但改進(jìn)還不夠,請返回技巧 8 檢查可能需要調整的其他因素。繼續一次進(jìn)行一項更改,重新運行查詢(xún)并比較結果,直到您對已解決所有可能的昂貴操作感到滿(mǎn)意為止。
技巧 10:如果您還需要更多改進(jìn),請考慮調整索引以減少邏輯 I/O
添加或調整索引并不總是最好的做法,但如果您不能更改代碼,這可能是唯一的選擇你可以做。您可以考慮對現有索引、覆蓋索引和過(guò)濾索引進(jìn)行改進(jìn)。
技巧 11:重新運行查詢(xún)并記錄結果
如果您進(jìn)行了調整,請重新運行查詢(xún)并再次記錄這些結果。
提示 12:設計出愚蠢的
Lookout 以防止經(jīng)常遇到的性能抑制因素,例如:代碼優(yōu)先生成器、濫用通配符、標量函數、嵌套視圖、游標和逐行處理。
3. 使用數據庫性能監控工具來(lái)促進(jìn)查詢(xún)調優(yōu)。
傳統的數據庫監控工具專(zhuān)注于健康指標。當前的應用程序性能管理工具提供提示,但不能幫助找到根本原因。
提示:通過(guò)使用連續的數據庫性能監控解決方案,您可以大大簡(jiǎn)化查詢(xún)調優(yōu)。數據庫性能監控工具的推薦包括:
SolarWinds ?數據庫性能分析器 (DPA)
SolarWinds Database Performance Analyzer (DPA) 可以將性能信息整合到一個(gè)地方。使用 DPA,您可以:
- 識別延遲的特定查詢(xún)
- 識別導致延遲的特定瓶頸(等待事件)
- 顯示已識別瓶頸的時(shí)間影響
SolarWinds? SQL Sentry
SQL Sentry 是另一種SQL服務(wù)器性能調整工具,可以幫助您解決性能問(wèn)題。使用 SQL Sentry,您可以查看歷史性能并檢測問(wèn)題以更快地開(kāi)始故障排除。
SQL 哨兵功能包括:
- 深入了解過(guò)去的SQL服務(wù)器性能 – 回到過(guò)去查看發(fā)生了什么變化
- 查看 Top SQL 查詢(xún)、阻塞和死鎖分析——查看特定時(shí)刻以更好地了解正在運行的查詢(xún)并分析阻塞詳細信息
- 優(yōu)化查詢(xún)——使用內置的 Plan Explorer 工具,您可以更輕松地分析查詢(xún)統計信息和查看查詢(xún)計劃圖