天天看點

《Oracle高性能SQL引擎剖析:SQL優化與調優機制詳解》一導讀

《Oracle高性能SQL引擎剖析:SQL優化與調優機制詳解》一導讀

作為一個資料庫管理系統來說,oracle不僅具備為使用者存儲和管理海量資料的能力,還能夠解析使用者送出結構化查詢語言(structured query language,sql)的請求,高效和快速地響應請求。為了保證語句的查詢效率,oracle開發了許多技術,從各個方面提供支援,例如,實體設計、記憶體管理和sql語句本身的自動優化與調優。

各種基于資料庫的系統中,絕大多數功能都需要通過資料庫管理系統查詢和操作資料,因而背景的性能對系統整體性能的影響是相當關鍵的。而要實作對資料的管理與查詢,程式需要通過sql語句對資料庫發起相應的請求。也就是說,sql語句的性能成為影響系統性能至關重要的因素。

oracle資料庫作為目前市場占有量最大的關系型資料庫管理系統,擁有成千上萬的專利技術保證資料庫系統的性能。而對于應用系統性能影響重大的sql引擎,oracle更是提供了強大的技術保障,不僅采用了主流資料庫系統當中優化效果最好的優化模式—基于代價的優化模式,還引入了數量龐大的、有别于其他資料庫系統的專利優化技術。這些優化技術使得oracle在sql優化和調優方面獨樹一幟。

然而,盡管oracle可能已經在内部幫助我們完成了99%的優化工作,但剩餘的1%仍然可能成為導緻性能下降的決定因素。是以,在oracle資料庫系統當中,發生性能問題的例子還是層出不窮。并且,以作者的個人經曆來看,這些性能問題絕大多數是由sql語句引起的。是以,深入了解和掌握oracle的sql語句優化和調優技術,是開發人員和資料庫管理者都應掌握的,也是開發出性能高效的資料庫系統的必要前提。

本書結合作者多年來對oracle的sql内部優化機制的研究以及sql調優的經驗,深入分析了oracle的各項sql語句的優化與調優技術,側重于對這些技術的内部機制的介紹,目的是幫助讀者更加深入地了解和消化這些技術,使讀者在面對和解決由sql引起的性能問題時,能透徹地看清問題的本質,迅速找到有效的解決方法。

sql優化是指在語句運作之前,由sql引擎對語句進行解析,采用各項技術對查詢進行優化,找到其最佳的執行路徑,即執行計劃;sql調優則是對已經存在執行計劃的語句進行進一步調整,使其運作性能更加接近性能名額的要求,達到性能改進的目的。sql優化與sql調優是在改善sql語句性能的過程中,兩個不同階段實施的技術與方法。sql優化,基本上是由優化器根據目前環境和資料實施的内部優化措施;sql調優,則是通過對語句、實體對象以及優化環境的幹預,使得優化器能夠選擇到最優的sql執行方式。是以,這兩個方面的技術内容是相輔相成的。

在rbo時期(9i之前),由于優化技術的限制,使得sql語句往往不能獲得最佳的執行計劃,進而導緻性能低下,需要依賴于開發人員或資料庫管理者的經驗和技能,對語句進行人工幹預,進而調整其性能。可以說,這個時期的優化技術是有限的,并且優化與調優過程比較獨立。進入cbo時代後,統計資料(statistics data)為優化器采用更加智能和複雜的優化技術提供了有力的資料保障,越來越多的基于代價的優化技術被應用到了oracle的sql引擎當中。同時,這也使得自動和智能化的優化技術成為可能。在10g、11g當中,oracle引入了多項新的優化技術。這些優化技術不僅僅能針對目前的運作結果進行調優,而且能對優化環境和實體設計等影響優化效果的因素進行深入檢查,提供短期和長期的各種調優建議。并且,部分調優結果還可以在語句的下一個執行周期中影響其優化方法。這就使得優化與調優技術更加緊密地結合在一起,為sql語句提供一個穩定、高效的運作性能。

簡單地說,我們在調整sql語句性能時,需要靈活地使用sql調優技術,使得sql語句在優化階段能夠獲得真正最佳性能的執行計劃。圖0-1描述了sql優化與sql調優在改進性能過程中所處的位置以及互相作用的方式。希望讀者可以先通過該圖體會到這兩方面技術之間的關系,在後續的閱讀和學習過程中能清楚地知道各種技術在提高性能過程中的作用。

無論是sql優化還是調優,它們的核心内容都是執行計劃(execution plan)。許多相關技術,例如查詢轉換、sql調用配置(sql profile)都是圍繞執行計劃這一要素展開的。本書将從執行計劃開始,逐漸剖析oracle的sql優化與調優的相關技術。

本書分為三篇、共八章。

第一篇解釋什麼是sql語句的執行計劃。主要内容包括:執行計劃在sql語句執行的生命周期中所處的位置和作用;sql引擎如何生成執行計劃以及如何手工生成一條語句的執行計劃;如何從各種資料源顯示和檢視已經生成的執行計劃。本篇的重點部分則是向讀者解釋如何讀懂執行計劃,包含執行計劃結構解析、各種資料所代表的含義、執行計劃各種操作的含義和示例,以及執行計劃與内部函數之間的本質關系。

第二篇深入分析oracle的sql優化技術。總體上來說,sql優化技術可以分為兩類:邏輯優化技術和實體優化技術。其中,邏輯優化主要是指查詢轉換技術。本篇當中詳盡地分析了10g、11g中現有的各種查詢轉換技術,并給出實際示例幫助讀者了解這些技術。而實體優化則指的是優化器通過代價估算來選擇最佳的執行計劃。優化器要正确估算執行計劃及其操作的代價,則需要準确的統計資料的支援。是以本書在分析優化器的代價估算方法之前,先分析oracle如何收集、統計系統和對象的統計資料。然後,結合作者推導出的各種代價估算公式,示範了各種情形下的代價計算方法。

[第一篇 執行計劃]()

[第1章 生成和顯示執行計劃 ]()

[1.1 生成執行計劃 ]()

[1.2 顯示執行計劃 ]()

1.2.1 通過查詢語句顯示計劃

1.2.2 通過包dbms_xplan顯示計劃

1.2.3 autotrace

1.2.4 其他方法

[第2章 解讀執行計劃 ]()

[2.1 執行計劃的基本資料]()

[2.2 内部函數與操作]()

[2.3 執行計劃各個列的含義]()

[2.4 執行計劃各個操作的含義]()

2.4.1 語句類型

2.4.2 通路路徑方法

2.4.3 位圖操作

2.4.4 排序操作

2.4.5 關聯操作

2.4.6 層次查詢操作

2.4.7 視圖操作

2.4.8 資料集合操作

2.4.9 分區操作

2.4.10 并行查詢操作

2.4.11 聚合操作

2.4.12 分析函數操作

2.4.13 模型化操作

2.4.14 資料和對象管理操作

2.4.15 其他操作

[2.5 執行計劃中其他資訊的含義]()

2.5.1 查詢塊和對象别名

2.5.2 計劃概要資料

2.5.3 綁定變量資訊

2.5.4 分布式查詢語句資訊

2.5.5 注釋

第二篇 sql優化技術

[第3章 查詢轉換]()

[3.1 啟發式查詢轉換]()

3.1.1 簡單視圖合并

3.1.2 子查詢反嵌套

3.1.3 子查詢推進

3.1.4 舊關聯謂詞推入

3.1.5 簡單過濾謂詞推入

3.1.6 謂詞遷移

3.1.7 “或”操作擴張

3.1.8 物化視圖查詢重寫

3.1.9 集合操作關聯轉變

3.1.10 由限制生成過濾謂詞

3.1.11 星形轉換

3.1.12 排序消除

3.1.13 distinct消除

3.1.14 表消除

3.1.15 子查詢合并

3.1.16 公共子表達式消除

3.1.17 計數函數轉變

3.1.18 表達式和條件評估

3.1.19 聚集子查詢消除

3.1.20 distinct聚集函數轉換

3.1.21 選擇字段裁剪

3.1.22 distinct消除

3.1.23 distinct推入

3.1.24 集合分組查詢轉換

3.1.25 集合分組查詢重寫

3.1.26 集合分組裁剪

3.1.27 外關聯消除

3.1.28 真正完全外關聯

3.1.29 左(右)外關聯轉換為側視圖

[3.2 基于代價的查詢轉換]()

3.2.1 複雜視圖合并

3.2.2 關聯謂詞推入

3.2.3 謂詞提取

3.2.4 group by配置

3.2.5 表擴張

3.2.6 關聯因式分解

3.2.7 distinct配置

3.2.8 with子查詢轉換