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