第 1章 Oracle裏的優化器 ...................................1
1.1 什麼是 Oracle裏的優化器 ...........................1
1.1.1 基於規則的優化器............................2
1.1.2 基於成本的優化器........................9
1.1.2.1 集的勢 ..............................11
1.1.2.2 可選擇率 ...............................11
1.1.2.3 可傳遞性..............................16
1.1.2.4 CBO的局限性...................................18
1.2 優化器的基礎知識 .......................19
1.2.1 優化器的模式..................................19
1.2.2 結果集............................21
1.2.3 訪問數據的方法................................22
1.2.3.1 訪問錶的方法.............................22
1.2.3.1.1 全錶掃描 ....................................22
1.2.3.1.2 ROWID掃描 .....................................23
1.2.3.2 訪問索引的方法 .....................................24
1.2.3.2.1 索引唯一性掃描 ...............................25
1.2.3.2.2 索引範圍掃描 .......................................25
1.2.3.2.3 索引全掃描 ......................................28
1.2.3.2.4 索引快速全掃描 ...............................29
1.2.3.2.5 索引跳躍式掃描 ...............................31
1.2.4 錶連接..........................33
1.2.4.1 錶連接的類型......................................34
1.2.4.1.1 內連接.............................................34
1.2.4.1.2 外連接.................................................37
1.2.4.2 錶連接的方法............................................47
1.2.4.2.1 排序閤並連接 ..................................47
1.2.4.2.2 嵌套循環連接 ...................................48
1.2.4.2.3 哈希連接 ..........................................51
1.2.4.2.4 笛卡兒連接 ......................................56
1.2.4.3 反連接 ...........................................58
1.2.4.4 半連接 ................................63
1.2.4.5 星型連接............................................65
1.3 優化器模式對 CBO計算成本帶來巨大影響的實例...............66
1.4 總結.......................80
第 2章 Oracle裏的執行計劃 ........................... 82
2.1 什麼是執行計劃.................................82
2.2 如何查看執行計劃 ..........................85
2.2.1 explain plan命令....................................86
2.2.2 DBMS_XPLAN包............................89
2.2.3 AUTOTRACE開關 ...............................95
2.2.4 10046事件與 tkprof命令.............................99
2.3 如何得到真實的執行計劃..................................102
2.4 如何查看執行計劃的執行順序.............................118
2.5 Oracle裏的常見執行計劃 .......................122
2.5.1 與錶訪問相關的執行計劃.................................122
2.5.2 與 B樹索引相關的執行計劃.................................124
2.5.3 與位圖索引相關的執行計劃...................................129
2.5.4 與錶連接相關的執行計劃.......................................138
2.5.5 其他典型的執行計劃...............................................146
2.5.5.1 AND-EQUAL(INDEX MERGE).....................146
INDEX JOIN ................................148
2.5.5.2 VIEW.......................149
2.5.5.3FILTER ..................................151
2.5.5.4 SORT ....................................154
2.5.5.5
2.5.5.6 UNION/UNION ALL......................167
CONCAT..................................................168
2.5.5.7
CONNECT BY...................................................171
2.5.5.8
2.6 Oracle裏執行計劃的穩定 ................................172
2.6.1 使用 SQL Profile來穩定執行計劃 ...........................173
2.6.1.1 Automatic類型的 SQL Profile ...............................173
2.6.1.2 Manual類型的 SQL Profile......................................179
2.6.2 使用 SPM來穩定執行計劃........................................190
2.7 總結..............................203
第 3章 Oracle裏的 Cursor和綁定變量 ......................... 204
3.1 Oracle裏的 Cursor.............................204
3.1.1 Oracle裏的 Shared Cursor.............................204
3.1.1.1 Shared Cursor的含義 ..........................................204
3.1.1.2 硬解析 ................................................212
3.1.1.3 軟解析 ...................................214
3.1.2 Oracle裏的 Session Cursor..............................215
3.1.2.1 Session Cursor的含義 .....................................215
3.1.2.2 Session Cursor的相關參數解析...........................218
OPEN_CURSORS.........................................218
3.1.2.2.1 SESSION_CACHED_CURSORS ............................219
3.1.2.2.2CURSOR_SPACE_FOR_TIME ..............................221
3.1.2.2.3
3.1.2.3 Session Cursor的種類和用法 .............................222
3.1.2.3.1 隱式遊標 ........................................222
3.1.2.3.2 顯式遊標 ........................................225
3.1.2.3.3 參考遊標 ........................................230
3.2 Oracle裏的綁定變量 ...............................237
3.2.1 綁定變量的作用....................................237
3.2.2 綁定變量的典型用法.........................................238
3.2.3 綁定變量的使用原則和最佳實踐..............................245
3.2.3.1 PL/SQL批量綁定模闆一 ...................................245
3.2.3.2 PL/SQL批量綁定模闆二 .....................................247
3.2.4 綁定變量窺探............................................258
3.2.5 綁定變量分級..................................270
3.2.6 綁定變量的個數不宜太多........................................276
3.2.7 批量綁定時如何處理錯誤.......................................280
3.2.8 如何得到已執行的目標 SQL中綁定變量的值 ..........283
3.3 Oracle裏的遊標共享 .......288
3.3.1 常規遊標共享..............................289
3.3.2 自適應遊標共享........................297
3.4 Oracle裏的應用類型 ...............................320
3.4.1 Session Cursor的生命周期.........................................320
3.4.2 應用類型一(硬解析)................................................322
3.4.3 應用類型二(軟解析)...............................................323
3.4.4 應用類型三(軟軟解析)..........................................323
3.4.5 應用類型四(一次解析、多次執行)....................324
3.4.6 四種應用類型的實測性能對比..............................325
3.5 總結.............................333
第 4章 Oracle裏的查詢轉換 .......................... 335
4.1 Oracle裏查詢轉換的作用 ................335
4.2 子查詢展開.................................336
4.3 視圖閤並............................344
4.3.1 簡單視圖閤並...........................345
4.3.2 外連接視圖閤並..................351
4.3.3 復雜視圖閤並.....................354
4.4 星型轉換.....................365
4.5 連接謂詞推入 ................372
4.6 連接因式分解 ................379
4.7 錶擴展 .......................387
4.8 錶移除 .............396
4.9 Oracle如何處理 SQL語句中的 IN.............401
IN-List Iterator .................402
4.9.1
4.9.2 IN-List Expansion / OR Expansion ................404
IN-List Filter .............409
4.9.3
4.9.4 對 IN做子查詢展開/視圖閤並 .............410
4.10 查詢轉換的綜閤應用實例(邏輯讀從 200萬降到 6) .....413
4.11總結..............................420
第 5章 Oracle裏的統計信息 ........ 422
5.1 什麼是 Oracle裏的統計信息...........422
5.2 Oracle裏收集與查看統計信息的方法 .............423
5.2.1 收集統計信息...................423
5.2.1.1 用 ANALYZE命令收集統計信息...........423
5.2.1.2 用 DBMS_STATS包收集統計信息..........428
5.2.1.3 ANALYZE和 DBMS_STATS的區彆........432
5.2.2 查看統計信息................433
5.3 錶的統計信息 ..............435
5.3.1 錶統計信息的種類和含義.........435
5.3.2 錶統計信息不準導緻 SQL性能問題的實例 .................437
5.4 索引的統計信息..............440
5.4.1 索引統計信息的種類和含義.................440
5.4.2 聚簇因子的含義及重要性............442
5.5 列的統計信息 ..................450
5.5.1 列統計信息的種類和含義..............450
5.5.2 列統計信息不準導緻謂詞越界的實例..........454
5.5.3 直方圖........................460
5.5.3.1 直方圖的含義...............460
5.5.3.2 直方圖的類型.................462
5.5.3.2.1 Frequency類型的直方圖 ...........463
5.5.3.2.2 Height Balanced類型的直方圖 ..................471
5.5.3.3 直方圖的收集方法................................475
5.5.3.4 直方圖對 CBO的影響 ....................477
5.5.3.4.1 直方圖對 Shared Cursor的影響 .............477
5.5.3.4.2 直方圖對可選擇率的影響 ................482
5.5.3.5 使用直方圖的注意事項...........................495
5.6 全局統計信息 ............................496
5.7 動態采樣............................507
5.8 多列統計信息 ...........................516
5.9 係統統計信息 .............................519
5.10 數據字典統計信息..................536
5.11內部對象統計信息 .............................539
5.12 Oracle裏的自動統計信息收集 .........................546
5.13 Oracle裏應如何收集統計信息 ..........................563
5.14 總結.........................567
第 6章 Oracle裏的 Hint..................... 568
6.1 什麼是 Hint .....................568
6.2 Hint的用法 ...............................576
6.3 Hint被 Oracle忽略的常見情形 ...............590
6.3.1 情形一:使用的 Hint有語法或者拼寫錯誤.................591
6.3.2 情形二:使用的 Hint無效.........................592
6.3.3 情形三:使用的 Hint自相矛盾..............597
6.3.4 情形四:使用的 Hint受到瞭查詢轉換的乾擾...........599
6.3.5 情形五:使用的 Hint受到瞭保留關鍵字的乾擾.........602
6.4 常見的 Hint ...............605
6.4.1 與優化器模式相關的 Hint................606
6.4.1.1 ALL_ROWS ...............606
6.4.1.2 FIRST_ROWS(n)...................606
RULE........................608
6.4.1.3
6.4.2 與錶訪問相關的 Hint...................615
FULL .......................615
6.4.2.1 ROWID .............615
6.4.2.2
6.4.3 與索引訪問相關的 Hint...................615
INDEX .........................615
6.4.3.1 NO_INDEX .....................616
6.4.3.2 INDEX_DESC ...............617
6.4.3.3 INDEX_COMBINE................618
6.4.3.4 INDEX_FFS ..................620
6.4.3.5
6.4.3.6 INDEX_JOIN.............621
6.4.3.7 AND_EQUAL.....................622
6.4.4 與錶連接順序相關的 Hint...................624
ORDERED ................................624
6.4.4.1 LEADING ........................626
6.4.4.2
6.4.5 與錶連接方法相關的 Hint.............628
6.4.5.1 USE_MERGE ............628
NO_USE_MERGE .............631
6.4.5.2 USE_NL............633
6.4.5.3 NO_USE_NL .................634
6.4.5.4 USE_HASH.............635
6.4.5.5 NO_USE_HASH ..........635
6.4.5.6
6.4.5.7 MERGE_AJ.........636
NL_AJ............................637
6.4.5.8 HASH_AJ.................637
6.4.5.9 MERGE_SJ....................637
6.4.5.10 NL_SJ...........................638
6.4.5.11HASH_SJ .......................639
6.4.5.12
6.4.6 與查詢轉換相關的 Hint .....................639
USE_CONCAT ...............639
6.4.6.1 NO_EXPAND ...............640
6.4.6.2 MERGE................642
6.4.6.3 NO_MERGE................642
6.4.6.4 UNNEST ....................643
6.4.6.5
6.4.6.6 NO_UNNEST........................643
EXPAND_TABLE .................................644
6.4.6.7 NO_EXPAND_TABLE .......................644
6.4.6.8
6.4.7 與並行相關的 Hint ...........................645
PARALLEL...................................645
6.4.7.1 NO_PARALLEL ................................652
6.4.7.2
6.4.7.3 PARALLEL_INDEX ................................654
NO_PARALLEL_INDEX......................................656
6.4.7.4
6.4.8 其他常見 Hint ............................656
DRIVING_SITE..............................656
6.4.8.1 APPEND ...........................................659
6.4.8.2 APPEND_VALUES ........................................662
6.4.8.3
6.4.8.4 PUSH_PRED .......................664
NO_PUSH_PRED ................................666
6.4.8.5
6.4.8.6 PUSH_SUBQ....................................666
6.4.8.7 NO_PUSH_SUBQ................669
OPT_PARAM ..............................................670
6.4.8.8 OPTIMIZER_FEATURES_ENABLE ...............................672
6.4.8.9
6.4.8.10 QB_NAME ........................................674
CARDINALITY .................................674
6.4.8.11SWAP_JOIN_INPUTS .............................677
6.4.8.12
6.5 用 Cardinality Hint解決 ORA-01555錯誤的實例...............682
6.6 總結...............................693
第 7章 Oracle裏的並行 ..................... 695
7.1 Oracle裏並行的基本概念 ...............695
7.1.1 為什麼要用並行.................695
7.1.2 並行的理論基礎....................696
7.1.3 Oracle裏能夠並行執行的操作...............697
7.1.4 Oracle裏與並行有關的術語及解釋 ..................707
7.1.4.1 Query Coordinator .............708
7.1.4.2 Query Slaves和 Query Slave Set.............708
7.1.4.3 Table Queues.........716
7.1.4.4 數據傳遞方法.............721
7.1.4.5 granules............735
7.1.4.6 直接讀取 ............737
7.1.5 深入解析並行執行計劃的實例.............746
7.2 Oracle裏並行的控製 ..........755
7.2.1 Oracle裏如何開啓並行 .............755
7.2.2 Oracle裏並行度的控製 .............760
7.2.3 Oracle RAC環境下的並行...........771
7.2.4 Oracle裏與並行相關的參數 ..............775
PARALLEL_MAX_SERVERS .........775
7.2.4.1 PARALLEL_MIN_SERVERS ......................776
7.2.4.2
7.2.4.3 自動並行相關的參數 ...................776
PARALLEL_DEGREE_POLICY ................................776
7.2.4.3.1 PARALLEL_MIN_TIME_THRESHOLD ...................................776
7.2.4.3.2
7.2.4.3.3 PARALLEL_DEGREE_LIMIT ..................777
PARALLEL_SERVERS_TARGET..................................777
7.2.4.3.4
7.2.4.4 自適應並行相關的參數...............778
PARALLEL_ADAPTIVE_MULTI_USER ...............778
7.2.4.4.1 PARALLEL_MIN_PERCENT ........................778
7.2.4.4.2 PARALLEL_AUTOMATIC_TUNING .........778
7.2.4.4.3
7.2.4.5 其他參數 ............................778
PARALLEL_THREADS_PER_CPU ...................................778
7.2.4.5.1 PARALLEL_EXECUTION_MESSAGE_SIZE.............779
7.2.4.5.2 PARALLEL_FORCE_LOCAL.........................779
7.2.4.5.3
7.2.5 繞開 Oracle並行執行 Bug大幅提升性能的實例 ................779
7.3 總結..........................805
第 8章 Oracle裏 SQL優化的方法論 ................... 807
8.1 Oracle裏如何做 SQL優化...................807
8.1.1 Oracle裏 SQL優化的本質是基於對 CBO和執行計劃的深刻理解 ......807
8.1.2 Oracle裏 SQL優化需要聯係實際的業務 ...................819
8.1.3 Oracle裏 SQL優化需要適時使用綁定變量 ............824
8.2 Oracle裏 SQL優化的方法論在實戰中的驗證...............824
8.3 總結......................841
· · · · · · (
收起)