編輯推薦
《基於Oracle的SQL優化》是本土Oracle數據庫性能優化大師泣血力作
集十數年實戰修行與潛心鑽研之大成;
蓋國強等國內數據庫一綫名傢聯閤推薦;
囊括數據庫性能優化技術所有分支與脈絡,講解通俗,實例經典。
內容簡介
《基於Oracle的SQL優化》是一本與眾不同的書,它的目的是使讀者真正掌握如何在Oracle數據庫裏寫齣高質量的SQL語句,以及如何在Oracle數據庫裏對有性能問題的SQL做診斷和調整。
《基於Oracle的SQL優化》從Oracle處理SQL的本質和原理入手,由淺入深、係統地介紹瞭Oracle數據庫裏的優化器、執行計劃、Cursor和綁定變量、查詢轉換、統計信息、Hint和並行等這些與SQL優化息息相關的本質性內容,並輔以大量極具藉鑒意義的一綫SQL優化實例,闡述瞭作者倡導的“從本質和原理入手,以不變應萬變”的優化思路,最後還介紹瞭作者在實際工作中總結齣來的Oracle數據庫裏SQL優化的方法論。
《基於Oracle的SQL優化》適用於使用Oracle數據庫的開發人員、OracleDBA和其他對Oracle數據庫感興趣的人員,也可以作為各院校相關專業的教學輔導和參考用書,或作為相關培訓機構的培訓教材。
作者簡介
崔華,網名dbsnake,OracleACE,ACOUG成員。
資深Oracle數據庫工程師,擁有Oracle數據庫技術各個領域的經驗,尤其是在Oracle數據庫性能優化與備份恢復方麵經驗豐富。
他與其他人閤作編寫瞭多本Oracle技術書籍,他經常在Oracle相關活動中發錶演講並在自己的博客上撰寫瞭大量技術文章。
精彩書評
★崔華的新作付梓,我有16字贈言相送:十載癡迷,三年砥礪,書成紙貴,其華熠熠。崔華在Oracle數據庫技術研究和鑽研方麵完全體現瞭“癡迷”二字,堅持十數年而不輟,屢屢有所得而忘食;而他在技術上之大成在最近三年,砥而礪之,始有此書,厚達韆頁,書成而紙為之貴。我相信其中所展現的纔華必將以其熠熠之輝耀人耳目。在與崔華相識之數年間,我從他的研究和文章中受教良多,相信讀者朋友們也必定可以從本書中獲益。
——蓋國強雲和恩墨創始人,OracleACE總監,ACOUG聯閤創始人 ★使用Oracle數據庫無非是想獲得較佳的應用性能,而幾乎所有應用的性能都受到SQL語句的莫大影響,可以說SQL語句質量的高下決定瞭Oracle數據庫的快慢。“從本質和原理入手,以不變應萬變”,正是優化SQL的上上之策。崔華對技術的熱情和鑽研在我所識朋友中數一數二,耗時17個月始得此部大作,如果你想獲得SQL執行時間瞬間從數小時縮至不到1秒的美妙體驗,本書不容錯過。
——張樂奕雲和恩墨技術總監,OracleACE總監,ACOUG聯閤創始人 ★毫無疑問,這是關於Oracle數據庫優化的一部扛鼎之作,崔華對本書傾注的精力和寫作態度,都令我非常敬佩。作者非常詳盡地介紹瞭優化器、統計信息、執行計劃、查詢轉換等重要內容。深入研究這些內容,SQL優化的能力一定會有巨大提升。
——熊軍雲和思墨西區技術總監,OracleACE ★我佩服崔華對各種問題刨根究底式的研究,如他對Trace文件的閱讀分析,可謂麯徑探幽,引人入勝,完美地重現瞭係統動態運行時的內幕。本書對各種復雜原理條分縷析,對各種現實問題進行瞭透徹的講解;而這些解說之所以如此清晰明瞭、讓人信服,我想根本的原因,是在於作者所編寫的大量示例及對這些示例的精彩演繹。這些示例及其背後的總結和升華,對於任何一位實踐工程師來說,都是一處處不可多得的熠熠生輝的寶藏。
——黃凱耀甲骨文Real-WorldPerformanceGroup首席工程師 目錄
第1章 Oracle 裏的優化器
1.1 什麼是Oracle 裏的優化器
1.1.1 基於規則的優化器
1.1.2 基於成本的優化器
1.1.2.1 集的勢
1.1.2.2 可選擇率
1.1.2.3 可傳遞性
1.1.2.4 CBO 的局限性
1.2 優化器的基礎知識
1.2.1 優化器的模式
1.2.2 結果集
1.2.3 訪問數據的方法
1.2.3.1 訪問錶的方法
1.2.3.1.1 全錶掃描
1.2.3.1.2 ROWID 掃描
1.2.3.2 訪問索引的方法
1.2.3.2.1 索引唯一性掃描
1.2.3.2.2 索引範圍掃描
1.2.3.2.3 索引全掃描
1.2.3.2.4 索引快速全掃描
1.2.3.2.5 索引跳躍式掃描
1.2.4 錶連接
1.2.4.1 錶連接的類型
1.2.4.1.1 內連接
1.2.4.1.2 外連接
1.2.4.2 錶連接的方法
1.2.4.2.1 排序閤並連接
1.2.4.2.2 嵌套循環連接
1.2.4.2.3 哈希連接
1.2.4.2.4 笛卡兒連接
1.2.4.3 反連接
1.2.4.4 半連接
1.2.4.5 星型連接
1.3 優化器模式對CBO 計算成本帶來巨大影響的實例
1.4 總結
第2章 Oracle 裏的執行計劃
2.1 什麼是執行計劃
2.2 如何查看執行計劃
2.2.1 explain plan 命令
2.2.2 DBMS_XPLAN 包
2.2.3 AUTOTRACE 開關
2.2.4 事件與tkprof 命令
2.3 如何得到真實的執行計劃
2.4 如何查看執行計劃的執行順序
2.5 Oracle 裏的常見執行計劃
2.5.1 與錶訪問相關的執行計劃
2.5.2 與B 樹索引相關的執行計劃
2.5.3 與位圖索引相關的執行計劃
2.5.4 與錶連接相關的執行計劃
2.5.5 其他典型的執行計劃
2.5.5.1 AND-EQUAL(INDEX MERGE)
2.5.5.2 INDEX JOIN
2.5.5.3 VIEW
2.5.5.4 FILTER
2.5.5.5 SORT
2.5.5.6 UNION/UNION ALL
2.5.5.7 CONCAT
2.5.5.8 CONNECT BY
2.6 Oracle 裏執行計劃的穩定
2.6.1 使用SQL Profile 來穩定執行計劃
2.6.1.1 Automatic 類型的SQL Profile
2.6.1.2 Manual 類型的SQL Profile
2.6.2 使用SPM 來穩定執行計劃
2.7 總結
第3章 Oracle 裏的Cursor 和綁定變量
3.1 Oracle 裏的Cursor
3.1.1 Oracle 裏的Shared Cursor
3.1.1.1 Shared Cursor 的含義
3.1.1.2 硬解析
3.1.1.3 軟解析
3.1.2 Oracle 裏的Session Cursor
3.1.2.1 Session Cursor 的含義
3.1.2.2 Session Cursor 的相關參數解析
3.1.2.2.1 OPEN_CURSORS
3.1.2.2.2 SESSION_CACHED_CURSORS
3.1.2.2.3 CURSOR_SPACE_FOR_TIME
3.1.2.3 Session Cursor 的種類和用法
3.1.2.3.1 隱式遊標
3.1.2.3.2 顯式遊標
3.1.2.3.3 參考遊標
3.2 Oracle 裏的綁定變量
3.2.1 綁定變量的作用
3.2.2 綁定變量的典型用法
3.2.3 綁定變量的使用原則和最佳實踐
3.2.3.1 PL/SQL 批量綁定模闆一
3.2.3.2 PL/SQL 批量綁定模闆二
3.2.4 綁定變量窺探
3.2.5 綁定變量分級
3.2.6 綁定變量的個數不宜太多
3.2.7 批量綁定時如何處理錯誤
3.2.8 如何得到已執行的目標SQL 中綁定變量的值
3.3 Oracle 裏的遊標共享
3.3.1 常規遊標共享
3.3.2 自適應遊標共享
3.4 Oracle 裏的應用類型
3.4.1 Session Cursor 的生命周期
3.4.2 應用類型一(硬解析)
3.4.3 應用類型二(軟解析)
3.4.4 應用類型三(軟軟解析)
3.4.5 應用類型四(一次解析、多次執行)
3.4.6 四種應用類型的實測性能對比
3.5 總結
第4章 Oracle 裏的查詢轉換
4.1 Oracle 裏查詢轉換的作用
4.2 子查詢展開
4.3 視圖閤並
4.3.1 簡單視圖閤並
4.3.2 外連接視圖閤並
4.3.3 復雜視圖閤並
4.4 星型轉換
4.5 連接謂詞推入
4.6 連接因式分解
4.7 錶擴展
4.8 錶移除
4.9 Oracle 如何處理SQL 語句中的IN
4.9.1 IN-List Iterator
4.9.2 IN-List Expansion / OR Expansion
4.9.3 IN-List Filter
4.9.4 對IN 做子查詢展開/視圖閤並
4.10 查詢轉換的綜閤應用實例(邏輯讀從200 萬降到6)
4.11 總結
第5章 Oracle 裏的統計信息
5.1 什麼是Oracle 裏的統計信息
5.2 Oracle 裏收集與查看統計信息的方法
5.2.1 收集統計信息
5.2.1.1 用ANALYZE 命令收集統計信息
5.2.1.2 用DBMS_STATS 包收集統計信息
5.2.1.3 ANALYZE 和DBMS_STATS 的區彆
5.2.2 查看統計信息
5.3 錶的統計信息
5.3.1 錶統計信息的種類和含義
5.3.2 錶統計信息不準導緻SQL 性能問題的實例
5.4 索引的統計信息
5.4.1 索引統計信息的種類和含義
5.4.2 聚簇因子的含義及重要性
5.5 列的統計信息
5.5.1 列統計信息的種類和含義
5.5.2 列統計信息不準導緻謂詞越界的實例
5.5.3 直方圖
5.5.3.1 直方圖的含義
5.5.3.2 直方圖的類型
5.5.3.2.1 Frequency 類型的直方圖
5.5.3.2.2 Height Balanced 類型的直方圖
5.5.3.3 直方圖的收集方法
5.5.3.4 直方圖對CBO 的影響
5.5.3.4.1 直方圖對Shared Cursor 的影響
5.5.3.4.2 直方圖對可選擇率的影響
5.5.3.5 使用直方圖的注意事項
5.6 全局統計信息
5.7 動態采樣
5.8 多列統計信息
5.9 係統統計信息
5.10 數據字典統計信息
5.11 內部對象統計信息
5.12 Oracle 裏的自動統計信息收集
5.13 Oracle 裏應如何收集統計信息
5.14 總結
第6章 Oracle 裏的Hint
6.1 什麼是Hint
6.2 Hint 的用法
6.3 Hint 被Oracle 忽略的常見情形
6.3.1 情形一:使用的Hint 有語法或者拼寫錯誤
6.3.2 情形二:使用的Hint 無效
6.3.3 情形三:使用的Hint 自相矛盾
6.3.4 情形四:使用的Hint 受到瞭查詢轉換的乾擾
6.3.5 情形五:使用的Hint 受到瞭保留關鍵字的乾擾
6.4 常見的Hint
6.4.1 與優化器模式相關的Hint
6.4.1.1 ALL_ROWS
6.4.1.2 FIRST_ROWS(n)
6.4.1.3 RULE
6.4.2 與錶訪問相關的Hint
6.4.2.1 FULL
6.4.2.2 ROWID
6.4.3 與索引訪問相關的Hint
6.4.3.1 INDEX
6.4.3.2 NO_INDEX
6.4.3.3 INDEX_DESC
6.4.3.4 INDEX_COMBINE
6.4.3.5 INDEX_FFS
6.4.3.6 INDEX_JOIN
6.4.3.7 AND_EQUAL
6.4.4 與錶連接順序相關的Hint
6.4.4.1 ORDERED
6.4.4.2 LEADING
6.4.5 與錶連接方法相關的Hint
6.4.5.1 USE_MERGE
6.4.5.2 NO_USE_MERGE
6.4.5.3 USE_NL
6.4.5.4 NO_USE_NL
6.4.5.5 USE_HASH
6.4.5.6 NO_USE_HASH
6.4.5.7 MERGE_AJ
6.4.5.8 NL_AJ
6.4.5.9 HASH_AJ
6.4.5.10 MERGE_SJ
6.4.5.11 NL_SJ
6.4.5.12 HASH_SJ
6.4.6 與查詢轉換相關的Hint
6.4.6.1 USE_CONCAT
6.4.6.2 NO_EXPAND
6.4.6.3 MERGE
6.4.6.4 NO_MERGE
6.4.6.5 UNNEST
6.4.6.6 NO_UNNEST
6.4.6.7 EXPAND_TABLE
6.4.6.8 NO_EXPAND_TABLE
6.4.7 與並行相關的Hint
6.4.7.1 PARALLEL
6.4.7.2 NO_PARALLEL
6.4.7.3 PARALLEL_INDEX
6.4.7.4 NO_PARALLEL_INDEX
6.4.8 其他常見Hint
6.4.8.1 DRIVING_SITE
6.4.8.2 APPEND
6.4.8.3 APPEND_VALUES
6.4.8.4 PUSH_PRED
6.4.8.5 NO_PUSH_PRED
6.4.8.6 PUSH_SUBQ
6.4.8.7 NO_PUSH_SUBQ
6.4.8.8 OPT_PARAM
6.4.8.9 OPTIMIZER_FEATURES_ENABLE
6.4.8.10 QB_NAME
6.4.8.11 CARDINALITY
6.4.8.12 SWAP_JOIN_INPUTS
6.5 用Cardinality Hint 解決ORA-01555 錯誤的實例
6.6 總結
第7章 Oracle 裏的並行
7.1 Oracle 裏並行的基本概念
7.1.1 為什麼要用並行
7.1.2 並行的理論基礎
7.1.3 Oracle 裏能夠並行執行的操作
7.1.4 Oracle 裏與並行有關的術語及解釋
7.1.4.1 Query Coordinator
7.1.4.2 Query Slaves 和Query Slave Set
7.1.4.3 Table Queues
7.1.4.4 數據傳遞方法
7.1.4.5 granules
7.1.4.6 直接讀取
7.1.5 深入解析並行執行計劃的實例
7.2 Oracle 裏並行的控製
7.2.1 Oracle 裏如何開啓並行
7.2.2 Oracle 裏並行度的控製
7.2.3 Oracle RAC 環境下的並行
7.2.4 Oracle 裏與並行相關的參數
7.2.4.1 PARALLEL_MAX_SERVERS
7.2.4.2 PARALLEL_MIN_SERVERS
7.2.4.3 自動並行相關的參數
7.2.4.3.1 PARALLEL_DEGREE_POLICY
7.2.4.3.2 PARALLEL_MIN_TIME_THRESHOLD
7.2.4.3.3 PARALLEL_DEGREE_LIMIT
7.2.4.3.4 PARALLEL_SERVERS_TARGET
7.2.4.4 自適應並行相關的參數
7.2.4.4.1 PARALLEL_ADAPTIVE_MULTI_USER
7.2.4.4.2 PARALLEL_MIN_PERCENT
7.2.4.4.3 PARALLEL_AUTOMATIC_TUNING
7.2.4.5 其他參數
7.2.4.5.1 PARALLEL_THREADS_PER_CPU
7.2.4.5.2 PARALLEL_EXECUTION_MESSAGE_SIZE
7.2.4.5.3 PARALLEL_FORCE_LOCAL
7.2.5 繞開Oracle 並行執行Bug 大幅提升性能的實例
7.3 總結
第8章 Oracle 裏SQL 優化的方法論
8.1 Oracle 裏如何做SQL 優化
8.1.1 Oracle 裏SQL 優化的本質是基於對CBO 和執行計劃的深刻理解
8.1.2 Oracle 裏SQL 優化需要聯係實際的業務
8.1.3 Oracle 裏SQL 優化需要適時使用綁定變量
8.2 Oracle 裏SQL 優化的方法論在實戰中的驗證
8.3 總結
精彩書摘
從上述顯示內容可以看齣,此SQL的執行計劃已經從之前的索引唯一性掃描變為現在的索引範圍掃描,其耗費的邏輯讀也從之前的73遞增到現在的74,這說明在同等條件下,當目標索引的索引行的數量大於1時,索引範圍掃描所耗費的邏輯讀確實至少會比相應的索引唯一性掃描多1。
注意,上述測試結果中邏輯讀為73和74;這是包含瞭硬解析時遞歸調用所耗費的邏輯讀,上述SQL在軟解析/軟軟解析的情況下不會有這麼多的邏輯讀。這裏容易引起誤解,因為這多齣來的邏輯讀可能來源於遞歸調用時所耗費的邏輯讀(但實際上這裏兩次遞歸調用所耗費的邏輯讀顯然是相同的)。
這裏更好的比較方式是不刷新數據字典緩存和Buffer Cache,然後多執行幾次上述SQL並取最後幾次穩定的執行結果。實際上,這種更好的比較方式所得到的測試結果和上述測試結果是一緻的。
關於硬解析和軟解析/軟軟解析,我們會在“第3章Oracle裏的Cursor和綁定變量”中詳細解釋,這裏不再贅述。
12.323索引全掃描
索引全掃描(INDEX FULL SCAN)適用於所有類型的8樹索引(包括唯一性索引和非唯一性索引)。所謂的“索引全掃描”,就是指要掃描目標索引所有葉子塊的所有索引行。這裏需要注意的是,索引全掃描需要掃描目標索引的所有葉子塊,但這並不意味著需要掃描該索引的所有分支塊。在默認情況下,Oracle在做索引全掃描時隻需要通過訪問必要的分支塊定位到位於該索引最左邊的葉子塊的第一行索引行,就可以利用該索引葉子塊之間的雙嚮指針鏈錶,從左至右依次順序掃描該索引所有葉子塊的所有索引行瞭。
既然在默認情況下,索引全掃描要從左至右依次順序掃描目標索引所有葉子塊的所有索引行,而索引是有序的,所以索引全掃描的執行結果也是有序的,
基於Oracle的SQL優化 下載 mobi epub pdf txt 電子書 格式