SQL,作為與數(shù)據(jù)庫交互的主要方式,其管理能力對數(shù)據(jù)庫的安全穩(wěn)定運行至關重要。作為數(shù)據(jù)庫的標桿性產(chǎn)品,Oracle 在這方面能力非常全面;與之相對的是國產(chǎn)數(shù)據(jù)庫還存在一定的差距。當前很多企業(yè)正面臨國產(chǎn)化替代的過程,更需正視這一差距,通過在生態(tài)工具、實施方案及自研增強等多種手段加以完善補充。下文從Oracle能力為基礎,介紹相關能力作用及國產(chǎn)數(shù)據(jù)庫當前現(xiàn)狀。文中選擇了部分國內(nèi)主流數(shù)據(jù)庫產(chǎn)品及開源產(chǎn)品作為對比,其相關能力取自官網(wǎng)和部分朋友的反饋。對比中加入了開源數(shù)據(jù)庫,主要是因為部分國產(chǎn)數(shù)據(jù)庫是基于開源數(shù)據(jù)庫二次化開發(fā)而來,此處列入方便對比。這里特別感謝幾位的朋友大力支持。
1. SQL 管理能力大對比
在下文展開之前,我們先通過一張表格做個全局性的概覽。
圖片
1).SQL 解析
SQL 解析,簡單描述就是將用戶提交的 SQL 語句,交由數(shù)據(jù)庫內(nèi)核,經(jīng)多個步驟后生成最終的執(zhí)行計劃,并交由執(zhí)行器來完成執(zhí)行。這其中關鍵能力有兩個,一是執(zhí)行計劃緩存,一是解析過程的跟蹤。
? 計劃緩存
執(zhí)行計劃的緩存可以加速后續(xù)相同語句的執(zhí)行速度,大部分數(shù)據(jù)庫都內(nèi)置了緩存能力,當然有利就有弊,有了緩存能力就需考慮緩存的更新機制等問題。Oracle Shard Pool 中的 Library Cache,保存了SQL對應的多個執(zhí)行計劃(以游標的形式存在)。可以說 Oracle 對執(zhí)行計劃的存儲控制,是我見過最為完善的,考慮到很多情況(如綁定變量、數(shù)據(jù)特征等等)。國產(chǎn)數(shù)據(jù)庫大多也支持了執(zhí)行計劃緩存,但管理粒度比較粗放且很多細節(jié)是未知的,相關文檔資料較少。
? 過程跟蹤
解析過程的跟蹤,作為 SQL 優(yōu)化的基礎,理解執(zhí)行計劃的生成過程非常重要;數(shù)據(jù)庫自身是否提供了一個窗口可以去觀察內(nèi)部執(zhí)行機理,對于 DBA 優(yōu)化非常實用。優(yōu)化器生成執(zhí)行的計劃的過程是比較復雜的,當一條語句的執(zhí)行計劃較差,一個很好的入口就是查看下優(yōu)化器生成執(zhí)行計劃的過程。Oracle 提供了等待事件10053,可以對整個執(zhí)行過程做了詳細的了解,通過對這個事件的閱讀可以幫我們回答很多問題。例如為什么選擇這個索引?多個近似成本的執(zhí)行計劃的選擇?等等。國產(chǎn)數(shù)據(jù)庫在這方面功能差距較大,大多沒有提供這一能力,很多時候是要靠 DBA 的經(jīng)驗來評估判斷的。
圖片
2).執(zhí)行計劃
執(zhí)行計劃,可以語句在數(shù)據(jù)庫中的執(zhí)行路徑,是了解數(shù)據(jù)庫運行機理的重要窗口。在此部分需提供的能力包含幾個,分別是執(zhí)行計劃的查看、固定、遷移和銷毀。
? 查看執(zhí)行計劃
可以說優(yōu)化SQL的第一步就是獲得一份準確詳實的執(zhí)行計劃。這里要區(qū)分兩種情況,一種是根據(jù)用戶提交的語句生成的執(zhí)行計劃,一種是對執(zhí)行過或進行中的語句獲得其執(zhí)行計劃。前者是優(yōu)化器新生成的執(zhí)行計劃,但不代表是真實執(zhí)行的,兩者可能會存在差異。Oracle提供了多種手段查看執(zhí)行計劃,而且可查詢當前正在執(zhí)行的或已結束語句的執(zhí)行計劃。國產(chǎn)數(shù)據(jù)庫也都提供了查看執(zhí)行計劃的手段,但一般僅支持第一種方式且信息輸出粒度也較Oracle存在一定差距。
? 固定執(zhí)行計劃
令DBA一個非常頭疼的問題就是執(zhí)行計劃不穩(wěn)定,受多種因素影響會出現(xiàn)這一現(xiàn)象,對于前端業(yè)務來說就會出現(xiàn)忽慢忽快的問題。為了使SQL語句的執(zhí)行穩(wěn)定下來,可以考慮對一些關鍵語句進行固定執(zhí)行計劃的工作。Oracle提供了多種手段達到這一目的。一種是常見的Hint方式,這種方式比較直接,但會導致失去其他優(yōu)化的可能性的同時,需要手工修改語句;另外Oracle還提供了其他多種手段,從9i的Stored Outline、10g的SQL Profile到11g的SQL Plan Management,實現(xiàn)從被動到主動、從固定到靈活地實現(xiàn)了執(zhí)行計劃的穩(wěn)定性。這方面國產(chǎn)數(shù)據(jù)庫也都提供了一定的能力,但相對來說能力較少,還處于被動補救的狀態(tài),尚不支持主動防御性的能力。
? 遷移執(zhí)行計劃
當數(shù)據(jù)庫需要遷移時,除了數(shù)據(jù)本身遷移外,還有很重要的一部分就是執(zhí)行計劃的遷移,這對于在新環(huán)境的穩(wěn)定運行很關鍵。Oracle提供了多種方式完成遷移過程,國產(chǎn)數(shù)據(jù)庫這方面比較缺失。
? 清理執(zhí)行計劃
如果一條語句的某個執(zhí)行計劃異常,常見的一個方式是讓其失效后,由優(yōu)化器重新生成一份執(zhí)行計劃。這時就需要能精準銷毀到指定執(zhí)行計劃的能力。Oracle是提供了專有的命令來完成清理,當然也可以通過權限變更等手段間接來清理掉執(zhí)行計劃。國產(chǎn)數(shù)據(jù)庫部分具備精確清理的能力,部分尚不具備。
圖片
3).SQL 優(yōu)化
? 診斷優(yōu)化
當出現(xiàn)某條語句性能比較差的情況,固然可以通過DBA人工來完成優(yōu)化,但更優(yōu)的方式是系統(tǒng)內(nèi)置的診斷優(yōu)化的能力。以Oracle為例,就提供了一組這樣的能力,它通過對數(shù)據(jù)對象、統(tǒng)計信息、SQL語句本身等多維度評估,給出優(yōu)化建議,用戶更可以基于優(yōu)化建議一鍵完成優(yōu)化動作。這邊可大大提高優(yōu)化效率、降低優(yōu)化成本,減輕DBA的工作壓力。這方面國產(chǎn)數(shù)據(jù)庫也具備一定能力,但一般都是通過外置工具來完成。
? 自動優(yōu)化
上面談到的優(yōu)化動作是指人為主動干預,診斷優(yōu)化指定語句,數(shù)據(jù)庫還可以提供自動優(yōu)化能力。Oracle一方面通過將若干上述能力組合實現(xiàn)了批量自動優(yōu)化;一方面還提供一種自適應特性,即在語句執(zhí)行過程中,動態(tài)根據(jù)執(zhí)行情況實時干預后面的執(zhí)行邏輯,修正執(zhí)行計劃達到最優(yōu)。部分國產(chǎn)數(shù)據(jù)庫也具備了類似的能力,但具體還待驗證。
圖片
4).執(zhí)行過程
? 查看過程
對SQL執(zhí)行過程的全方位追蹤,也非常重要,可以真實了解語句的執(zhí)行狀態(tài),根據(jù)執(zhí)行過程中暴露出的問題有針對性的進行調(diào)整優(yōu)化。要做到對語句執(zhí)行追蹤是比較難的,需要兼顧效率、開銷、粒度等。Oracle在這方面做的非常突出,其提出的事件模型較好地解決了這一問題。其提供了豐富的手段可以對正在執(zhí)行或已經(jīng)執(zhí)行結束的語句實現(xiàn)過程查看。國產(chǎn)數(shù)據(jù)庫在這方面差距還是很明顯的,也看到有國內(nèi)產(chǎn)品在仿照Oracle的方式來實現(xiàn)這一能力。
? 慢SQL
慢SQL,是DBA優(yōu)化的入手點,這里談到的慢SQL狹義上指執(zhí)行時長超過預期的SQL,廣義上是對更多資源粒度使用超出預期語句的集合。這方面Oracle基于AWR的存儲庫,提供了豐富的維度去檢索查詢語句。國產(chǎn)數(shù)據(jù)庫這方面做到稍顯單薄些,大多僅有對運行時間超長語句的輸出。
圖片
5).其他能力
除了上述能力外,還有些能力也有助于對SQL的管理。例如可以重點標識語句的“著色”功能,用于升序遷移評估的SQL回放功能,用于調(diào)整對象進而影響執(zhí)行計劃的不可見索引,用于應急處理語句的雨具重寫功能等。這部分功能比較零散,大多根據(jù)實踐中不斷增強,各廠商差異較大。
圖片
2. 國產(chǎn)數(shù)據(jù)庫實施建議
針對國產(chǎn)庫現(xiàn)狀的不足,在實施過程中可根據(jù)以下幾個方面進行準備
1).制定開發(fā)規(guī)范
充分地了解國產(chǎn)數(shù)據(jù)庫的技術特點,制定有針對性的設計開發(fā)規(guī)范。很多國產(chǎn)數(shù)據(jù)庫基于多年實踐,也都提供了開發(fā)規(guī)范,可以充分地予以吸納。特別是針對分布式數(shù)據(jù)庫,對開發(fā)有較多約束,要在系統(tǒng)設計、遷移之初就基于考慮。通常原則是盡量簡化對數(shù)據(jù)庫的使用,拒絕3B 大SQL(Big SQL) 大事務(Big transaction) 大批量(Big batch) 。
2).完善工具平臺
基于國產(chǎn)數(shù)據(jù)庫內(nèi)核能力的不足,還需要較長一段時間來完善升級,可通過外部工具或平臺的方式補齊內(nèi)部短板。一方面可通過企業(yè)自研的方式增強對國產(chǎn)庫的管理能力,一方面也可利用一些外圍工具(如海信的DB Doctor、白鱔老師的D-Smart)來增強。
3).培養(yǎng)人與技能
要想使用好國產(chǎn)數(shù)據(jù)庫,更多是需要人員及技能。目前國產(chǎn)數(shù)據(jù)庫在生態(tài)建設方面還尚屬初期階段,需要企業(yè)內(nèi)部獨立培養(yǎng)更多的人并具備相應的技能。只要充分地了解理解數(shù)據(jù)庫,才能更好地使用它。業(yè)內(nèi)有某公司使用國產(chǎn)數(shù)據(jù)庫,內(nèi)部超千人通過認證培訓的案例即說明了這點。