優化新做,《跨 界 之SQL、PL/SQL優化指南》詳細目錄。ide
目 錄函數
一.理論篇................................................................10oop
1.1). SQL的處理過程.................................................10性能
1.2). 鏈接方式(JOIN METHODS)........................................10優化
1.2.1). 嵌套循環鏈接(Nested Loops Joins)......................11lua
1.2.2). 哈希鏈接(Hash Joins)................................12spa
1.2.3). 排序合併鏈接(Sort Merge Joins)......................15設計
1.2.4). 笛卡爾積鏈接(Cartesian Joins).......................17日誌
1.3). 表的訪問路經(table Access Paths)............................18對象
1.3.1). 直接路徑讀(Direct Path Reads).........................18
1.3.2). 全表掃描(Full Table Scans)............................19
1.3.3). 經過 ROWID 訪問表(Table Scans By ROWID)...............19
1.3.4). 示例表掃描(Sample Table Scans)........................20
1.3.5). B-TREE索引路徑訪問(B-tree Index Paths) ...............25
1.3.6). 位圖索引路徑訪問(Bitmap Index Access Paths).........29
1.3.7). 簇表訪問路徑(Table Cluster Access Paths)..............30
1.3.8). HASH掃描(Hash Scans)..................................31
1.4).分區表和分區索引...............................................31
1.4.1).分區表類型.............................................31
1.4.1.1). Range分區....................................31
1.4.1.2). List分區.....................................32
1.4.1.3). Hash分區.....................................35
1.4.1.4). 組合分區.....................................36
1.4.1.4.1). Range-hash組合分區..............37
1.4.1.4.2). Range-list分區..................38
1.4.1.4.3). Range-range分區.................39
1.4.1.4.4). List-hash分區...................39
1.4.1.4.5). List-list分區...................40
1.4.1.4.6). List-range分區..................40
1.4.1.5). 引用分區.....................................41
1.4.1.6). 內存列分區(僅限於12C)........................41
1.4.1.7). 間隔分區.....................................42
1.4.1.8). 系統分區.....................................42
1.4.1.9). 虛擬列分區...................................43
1.4.1.10). 分區表使用壓縮特徵..........................43
1.4.2). 分區索引..............................................44
1.4.2.1). 全局分區索引.................................44
1.4.2.2). 本地分區索引.................................46
1.4.3). 分區索引的使用原則....................................47
1.5). 索引...............................................................47
1.5.1). B-TREE索引.................................................47
1.5.1.1). 反鍵索引(Reserve Key Indexes)....................48
1.5.1.2). 降序索引(Descending Indexes).....................49
1.5.1.3). B-TREE簇索引(B-tree Cluster Indexes).............50
1.5.1.4). 索引組織表(Index-organized Tables)...............51
1.5.2). 位圖和位圖鏈接索引(Bitmap and Bitmap Join Indexes).........52
1.5.3). 基於函數的索引(Functions-based Indexes)....................53
1.5.4). 域索引(Application Domain Indexes).........................54
1.5.4.1). 上下文索引(Context Indexes)......................54
1.5.4.2). CTXCAT索引.......................................56
1.5.4.3). 基於規則的索引(Rule Based Indexes)...............58
1.5.5). 創建索引的注意事項.........................................59
1.5.6). 使用索引的注意事項.........................................59
1.5.7). 全表掃描有時爲何比索引掃描高效...........................60
二. 設計篇...............................................................61
2.1). 表的設計........................................................61
2.1.1). 何時使用堆表(Head-organized Tables).................61
2.1.2). 何時使用素引組織表(Index-organized Tables)..........61
2.1.3). 何時使用只讀表(Read Only Tables)....................62
2.1.4). 何時使用臨時表(Temporary Tables)....................62
2.1.5). 何時使用簇表(Cluster Tables)........................63
2.1.6). 何時使用壓縮表(Compressed Tables)...................64
2.1.7). 何時使用分區表(Partition Tables)....................64
2.1.8). 何時使用外部表(External Tables).....................65
2.1.9). 何時使用虛擬列(Virtual Columns).....................66
2.1.10). 何時使用不可見列(Invisible Columns)................67
2.1.11). VARCHAR2和 NUMBER字段類型的選擇........................67
2.1.12). NUMBER 和PLS_INTRGER類型的選擇.........................68
2.1.13). NUMBER 和SIMPLE_DOUBLE, SIMPLE_FLOAT類型的選擇.........68
2.1.14). NUMBER和NUMERIC 類型的選擇.............................69
2.1.15). LONG、CLOB、BLOB等大字段儘可能少用,如要使用用文件系統儲存
.........................................................69
2.1.16). 建表時PCTFREE和 PCTUSED 參數的選擇....................69
2.1.17). 建表時經常使用字段儘可能放在前面............................70
2.1.18). 歸檔表,歷史表和只讀表可使用壓縮功能................70
2.1.19). 大表要考慮數據的保留期限,轉移和清理機制,數據不要老放在
一個表裏.................................................71
2.1.20). 對象命名時要作到知名見議,符合項目規範................71
2.1.21). 表名,字段名要加註釋..................................71
2.1.22). 大表上嚴禁建觸發器....................................72
2.1.23). 日誌大表不要加任何約束條件............................72
2.1.24). 不要使用ORACLE自帶的表空間,更不能使用SYSTEM, SYSAUX表空間,
按要求自建表空間存放用戶數據.............................72
2.2). 索引的設計...................................................72
2.2.1). 表的關聯條件上應該創建索引.............................72
2.2.2). 能過濾大量數據的字段上應該創建索引.....................73
2.2.3). 索引應該建在高可用字段上面,列的非重複值/總行數 越接近於1,
表示可用性越高............................................73
2.2.4). 一些快態、類型字段上少建B-TREE索引.....................74
2.2.5). 建組合索引時,要把最經常使用的字段放在前面.................74
2.2.6). 能用單索引實現的,就少使用組合索引.....................75
2.2.7). 索引不要包含"包含與被包含"關係.........................75
2.2.8). 常常進行寫操做的表應少建索引...........................76
2.2.9). NULL值使用索引的問題...................................77
2.2.10). LIKE 使用索引的問題...................................78
2.2.11). 一個有意思的索引案例..................................79
2.2.12). 建索引時,索引的表空間要和數據的表空間分離............80
2.2.13). VARCHAR2類型定義長度大小對索引的影響..................80
2.2.14). 外健不加索引會引起死鎖和錶鏈接性能的問題..............80
2.2.15). 索引的命名問題........................................83
2.3). 其它對象的設計...............................................84
2.3.1). 序列的設計.............................................84
2.3.2). 儘可能少用VIEW...........................................84
2.3.3). 類似語句須要使用綁定變量...............................86
2.3.4). PL/SQL中能用靜態SQL實現的邏輯,儘可能不要使用動態SQL。若是
使用動態SQL儘量的使用綁定變量...........................86
2.3.5). 使用F0RALL代替FOR ...LOOP循環..........................87
2.3.6). PL/SQL中應直接賦值,不要使用Select XXX into 變量 from dual
的方式....................................................88
2.3.7). PL/SQL中DML和DDL語句不能混放在一塊兒,不然會產生意想不到的
結果......................................................88
2.3.8). 子程序中參數的定義,儘可能使用%TYPE 來綁定,全部變量儘可能
加上註釋.................................................89
2.3.9). 當函數被反覆調用,且參數不常改變時,能夠啓用 RESULT_CACHE
功能.................................................89
2.3.10). 注意短路評估的問題(Short -Circult Evaluation)........90
2.3.11). 使用SELECT BULK COLLECT INTO代替SELECT INTO 返回
多行結果集..............................................91
2.3.12). 因爲SELECT BULK COLLECT INTO語句返回大量行會產生巨大的
集合,應該限制返回的行數................................92
2.3.13). FETCH BULK COLLECT語句使用LIMIT限制返回的行數和
集合大小................................................93
2.3.14). RETURNING INTO子句使用BULK COLLECT...................94
2.3.15). 使用管道表函數(PIPED TABLE FUNCTIONS)..............95
2.3.16). 異常處理(EXCEPTION)................................95
2.3.17). 若是子程序返回遊標類型參數,必須在任何出口前打開遊標,
用完後須關閉............................................97
2.3.18). 書寫格式按照右對齊的原則進行編寫.....................98
2.3.19). 註釋部分.............................................98
2.3.20). 處理業務邏輯時,先鎖住A表再鎖B表,全部的處理都要按照
這個順序,不然可能產生死鎖.............................100