數(shù)據(jù)庫(kù)管理員 (DBA) 就像賽車技師。構(gòu)建和優(yōu)化高性能車輛需要進(jìn)行細(xì)微的微調(diào)和對(duì)細(xì)節(jié)的關(guān)注。這里的調(diào)整和那里的調(diào)整可以將你的單圈時(shí)間縮短幾分之一秒。當(dāng)然,那幾分之一秒可以決定你是贏還是輸。作為 DBA,您有責(zé)任微調(diào)您的 SQL 查詢,使它們具有額外的功能。即使是速度上的微小改進(jìn)也可能使您領(lǐng)先于競(jìng)爭(zhēng)對(duì)手,并使您成為客戶(或老板)眼中的贏家。
雖然 SQL 性能調(diào)優(yōu)不是一夜之間成為專家的事情,但在您作為云 DBA 起步時(shí),有一些準(zhǔn)則需要遵循。本指南將為您提供一個(gè)基本框架,供您發(fā)展技能和知識(shí)庫(kù)。您將學(xué)習(xí)一些重要的交易技巧,例如如何分桶思考和對(duì)相關(guān)指標(biāo)進(jìn)行分組。還包括數(shù)據(jù)庫(kù)維護(hù)任務(wù)的一般清單和 SQL 調(diào)優(yōu)軟件的免費(fèi)演示。
1、什么是SQL性能調(diào)優(yōu)?
明確定義什么是 SQL 性能調(diào)優(yōu)并了解您要實(shí)現(xiàn)的目標(biāo)可能會(huì)有所幫助。SQL 性能調(diào)優(yōu)是改進(jìn)在數(shù)據(jù)庫(kù)中執(zhí)行的查詢的過(guò)程,目的是盡可能高效和快速地返回所需的結(jié)果??赡苡袔资N方法可以返回相同的結(jié)果,而 SQL 性能調(diào)優(yōu)就是找到最快/成本最低的一種。
SQL 調(diào)優(yōu)中沒(méi)有萬(wàn)靈藥。在一種情況下可能是最佳實(shí)踐的方法不適用于另一種情況。并非所有數(shù)據(jù)庫(kù)在用途(思考 OLTP 與 OLAP/數(shù)據(jù)倉(cāng)庫(kù))或大小(思考 gigs 與 teras)方面都是平等的。這是一個(gè)不斷測(cè)試和記錄結(jié)果,然后再次測(cè)試的過(guò)程。
在執(zhí)行性能調(diào)優(yōu)任務(wù)時(shí),重要的是:
- 分桶思考
- 關(guān)注相關(guān)指標(biāo)
- 隨著時(shí)間的推移衡量結(jié)果
- 定期維護(hù)數(shù)據(jù)庫(kù)
2. 分桶思考
當(dāng)面臨數(shù)據(jù)庫(kù)性能調(diào)優(yōu)任務(wù)時(shí),可能很難決定從哪里開(kāi)始。您可能還不知道數(shù)據(jù)庫(kù)的哪個(gè)方面需要注意。在談?wù)撛谠浦泄芾頂?shù)據(jù)庫(kù)時(shí),您可能不得不考慮一些在本地?cái)?shù)據(jù)庫(kù)時(shí)不必?fù)?dān)心的事情。
制定行動(dòng)計(jì)劃的最佳方式是分桶思考。查看您的數(shù)據(jù)庫(kù),就像機(jī)械師分析剛進(jìn)店的汽車一樣。一次查看所有內(nèi)容并不是很有幫助,因此機(jī)械師會(huì)根據(jù)問(wèn)題的功能和位置來(lái)查看問(wèn)題。是暫停的問(wèn)題嗎?引擎?還是需要身體鍛煉?您可以將這些稱為汽車維修的“桶”。
在數(shù)據(jù)庫(kù)性能調(diào)優(yōu)方面,將潛在問(wèn)題分成不同的桶意味著根據(jù)共性組織一切。對(duì)于數(shù)據(jù)庫(kù)和調(diào)整 SQL,桶可以被認(rèn)為是:
- 資源(物理或虛擬)
- 索引/數(shù)據(jù)模型
- 查詢結(jié)構(gòu)
- 并發(fā)(阻塞——多個(gè)線程請(qǐng)求鎖定同一數(shù)據(jù)庫(kù)資源)
從那里,您可以深入到其他“桶”以確定問(wèn)題的根源。以資源為例,因?yàn)槿绻臄?shù)據(jù)庫(kù)位于云中,這可能是您必須更加關(guān)注的一件事。以下是在考慮使 SQL 語(yǔ)句運(yùn)行得更好時(shí)要考慮的一些資源類別:
- 記憶
- 磁盤 I/O(容量和延遲)
- 中央處理器
- 網(wǎng)絡(luò)
相同的進(jìn)一步細(xì)分可用于其他“存儲(chǔ)桶”,但我們不會(huì)深入研究這些“存儲(chǔ)桶”,因?yàn)樵诳紤]內(nèi)部部署與云時(shí)它們不會(huì)發(fā)生重大變化。
3.關(guān)注相關(guān)指標(biāo)
當(dāng)您測(cè)試您的查詢并微調(diào)您的數(shù)據(jù)庫(kù)時(shí),您將跟蹤特定指標(biāo)以便繪制隨時(shí)間改進(jìn)的圖表。這些指標(biāo)可能包括:
- 等待狀態(tài)(數(shù)據(jù)庫(kù)花時(shí)間為最終用戶執(zhí)行查詢)
- CPU 利用率和信號(hào)等待
- 提交響應(yīng)時(shí)間
- SQL語(yǔ)句編譯
- 交易吞吐量
- 內(nèi)存壓力(閂鎖爭(zhēng)用和數(shù)據(jù)快速?zèng)_出內(nèi)存)
- 磁盤 I/O 延遲
- 網(wǎng)絡(luò)帶寬和使用情況(這對(duì)于支持云中的數(shù)據(jù)庫(kù)尤為重要)
使用等待狀態(tài)作為用于關(guān)聯(lián)的指標(biāo)的指南。如果您的數(shù)據(jù)庫(kù)將所有時(shí)間都花在磁盤讀取上,那么查看內(nèi)存壓力(為什么它總是不得不返回到磁盤?)和磁盤性能(讀取延遲)作為相關(guān)指標(biāo)來(lái)查看這些特定資源是否導(dǎo)致性能問(wèn)題.?另一個(gè)很好的例子是阻塞。如果您的數(shù)據(jù)庫(kù)將所有時(shí)間都花在等待釋放鎖上,則您無(wú)法關(guān)聯(lián) CPU、內(nèi)存、磁盤或網(wǎng)絡(luò)爭(zhēng)用或壓力。
在性能指標(biāo)方面,數(shù)據(jù)庫(kù)分析工具是您最好的朋友。Database Performance Analyzer中的儀表板功能提供了一個(gè)有價(jià)值的窗口,用于了解指標(biāo)如何相互關(guān)聯(lián)。多維性能分析為您提供了正確的上下文,因此您可以從多個(gè)角度查看數(shù)據(jù)并三角測(cè)量性能問(wèn)題的根本原因。多維視圖為您提供所需的人物、內(nèi)容、時(shí)間、地點(diǎn)和原因的答案。
使用SolarWinds???SQL Sentry,DBA 可以通過(guò)快速查看實(shí)時(shí)和歷史事件及性能數(shù)據(jù),更深入地了解整個(gè) Microsoft 數(shù)據(jù)資產(chǎn)。SQL Sentry還可以顯示執(zhí)行計(jì)劃圖、查詢歷史記錄等,因此您可以快速找到并修復(fù)可能有問(wèn)題的查詢。
4. 隨著時(shí)間的推移衡量結(jié)果
要了解您的 SQL 查詢的執(zhí)行情況,您需要隨時(shí)間跟蹤您的指標(biāo)。在幾周甚至幾個(gè)月的時(shí)間里收集數(shù)據(jù)將使您對(duì)數(shù)據(jù)庫(kù)的整體性能有一個(gè)全面的了解。這將幫助您查看總體情況,而不是單個(gè)事件的快照。它可以幫助您回答以下問(wèn)題:“我現(xiàn)在的表現(xiàn)是否比以往更差?”?憑借隨時(shí)間繪制性能圖表的能力,可以將其用作基準(zhǔn)來(lái)確定任何給定時(shí)間范圍內(nèi)的性能是否超出正常范圍。一個(gè)例子可能是將月末活動(dòng)與上個(gè)月末而不是上周進(jìn)行比較。
5.數(shù)據(jù)庫(kù)維護(hù)任務(wù)
數(shù)據(jù)庫(kù)維護(hù)對(duì)于 SQL 調(diào)優(yōu)至關(guān)重要,因?yàn)榇巳蝿?wù)使您能夠發(fā)現(xiàn)潛在問(wèn)題并解決您可能從未意識(shí)到的問(wèn)題。維護(hù)任務(wù)可能因環(huán)境而異,但建議執(zhí)行一些常見(jiàn)或一般任務(wù)。
在進(jìn)入具體的維護(hù)任務(wù)之前,這里有幾個(gè)每個(gè) DBA 都應(yīng)該熟悉的首字母縮略詞:
- SLA – 服務(wù)水平協(xié)議(您和企業(yè)最終用戶達(dá)成的協(xié)議)
- RPO – 恢復(fù)點(diǎn)目標(biāo)
- RTO – 恢復(fù)時(shí)間目標(biāo)
- MTTI – Mean Time To Innocence(證明問(wèn)題不在于數(shù)據(jù)庫(kù)所花費(fèi)的時(shí)間)
請(qǐng)牢記這些首字母縮略詞,以下是您作為 DBA 需要執(zhí)行日常維護(hù)的主要領(lǐng)域:
1. 備份——這需要以符合 RPO/RTO/SLA 目標(biāo)的方式完成,但它會(huì)因系統(tǒng)而異。一種可能的方法是在工作時(shí)間進(jìn)行每周完整備份、每日差異/增量備份和每小時(shí)事務(wù)日志備份(對(duì)于 SQL Server?)。這將為您提供相當(dāng)數(shù)量的保護(hù),但并不適用于所有系統(tǒng)。
例如,一個(gè) 30PB 的數(shù)據(jù)庫(kù)不太可能需要每周進(jìn)行完整備份。另外,了解恢復(fù)到昨天、上周、上個(gè)月或去年需要多長(zhǎng)時(shí)間也很重要。您需要制定恢復(fù)計(jì)劃并使您的備份符合該計(jì)劃。
記住,如果你不能調(diào)整你的數(shù)據(jù)庫(kù)環(huán)境,你可能不會(huì)得到加薪,但如果你不能保證你可以恢復(fù),你將沒(méi)有工作。
2. 索引維護(hù)——您的索引需要經(jīng)常檢查,最有可能每天檢查一次。但是,您可能不想每晚都重建索引。同樣,這取決于系統(tǒng)和重建所需的時(shí)間長(zhǎng)度。索引中的碎片級(jí)別可能導(dǎo)致更新統(tǒng)計(jì)信息或重新組織索引比重建索引更好。
3. 更新統(tǒng)計(jì)數(shù)據(jù)——理想情況下需要每天檢查統(tǒng)計(jì)數(shù)據(jù)。這些檢查取決于系統(tǒng)、更新統(tǒng)計(jì)信息的時(shí)間長(zhǎng)度、數(shù)據(jù)庫(kù)對(duì)象(表和索引)中的變動(dòng)量,以及下次運(yùn)行時(shí)將被迫重新編譯的查詢。
4. 腐敗檢查——你應(yīng)該把檢查腐敗作為首要任務(wù),至少每月一次。
5. 捕獲配置詳細(xì)信息——對(duì)于數(shù)據(jù)庫(kù)和服務(wù)器,您希望每天獲取配置設(shè)置的詳細(xì)信息,并在進(jìn)行更改時(shí)進(jìn)行跟蹤。您可以擴(kuò)展它以捕獲其他內(nèi)容,例如創(chuàng)建或刪除的登錄/用戶、這些用戶的權(quán)限等。詳細(xì)程度取決于每個(gè) DBA 的勤奮程度,以及他們保持低 MTTI 的愿望。
6.有用的資源
除了維護(hù)任務(wù)清單之外,這里還有一些有用的資源可以幫助您作為數(shù)據(jù)庫(kù)管理員進(jìn)行開(kāi)發(fā):
- 對(duì)于 SQL 查詢調(diào)優(yōu),請(qǐng)查看此12 步指南
- 要編寫(xiě)更好的 SQL 查詢,請(qǐng)深入閱讀T-SQL 查詢一書(shū)
- 免費(fèi)試用數(shù)據(jù)庫(kù)性能分析器
- SQL Server 性能調(diào)優(yōu)的 3 個(gè)有用技巧
- 下載SQL Sentry 的免費(fèi)試用版
結(jié)論
如您所見(jiàn),作為云 DBA 包含許多與傳統(tǒng) DBA 相同的關(guān)注點(diǎn)和活動(dòng)。我們可以使用許多與過(guò)去相同的工具和方法來(lái)解決性能問(wèn)題。云和未來(lái)的 DBA 可能需要對(duì)技術(shù)有更廣泛的理解。因此,擺脫那些網(wǎng)絡(luò)技能,讓你的頭腦進(jìn)入云端。