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