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