Oracle效能優化求生指南pdf
阿新 • • 發佈:2019-02-07
目 錄
第一部分 方法、概念和工具
第1章 Oracle效能調優:一種系統化方法 2
1.1 Oracle效能調優簡史 3
1.2 超越表面分析法 3
1.3 第一階段:最小化應用負載 5
1.4 第二階段:降低爭用和瓶頸 6
1.5 第三階段:降低物理IO 7
1.6 第四階段:優化磁碟IO 8
1.7 本章小結 9
第2章 Oracle體系結構與基本概念 11
2.1 Oracle API 11
2.1.1 建立遊標 13
2.1.2 檢查快取的SQL語句 13
2.1.3 解析SQL語句 13
2.1.4 關聯繫結變數 14
2.1.5 執行SQL語句 15
2.1.6 提取記錄 15
2.1.7 使用批量提取 15
2.1.8 處理結果集 16
2.1.9 關閉遊標 16
2.1.10 優化Oracle API呼叫 16
2.2 Oracle查詢優化器 16
2.2.1 基於成本的優化 17
2.2.2 優化器目標 18
2.2.3 優化器統計資訊 18
2.2.4 繫結變數窺視與自適應遊標共享 19
2.2.5 提示 19
2.2.6 儲存概要、SQL概要和SQL計劃基線 19
2.3 事務和鎖 20
2.4 Oracle伺服器體系結構 20
2.4.1 例項與資料庫 21
2.4.2 系統全域性區 22
2.4.3 資料快取 22
2.4.4 程式全域性區 22
2.4.5 記憶體管理 23
2.5 段與檔案 23
2.5.1 表 23
2.5.2 索引 24
2.5.3 塊、區間、段以及分割槽 24
2.5.4 表空間與資料檔案 25
2.5.5 回滾段 25
2.5.6 重做日誌與歸檔日誌 25
2.5.7 閃回日誌 25
2.6 伺服器程序 26
2.7 後臺程序 26
2.8 真正應用叢集 27
2.9 本章小結 28
第3章 實用工具 29
3.1 生成SQL語句的執行計劃 29
3.1.1 計劃表 30
3.1.2 研究快取的SQL 33
3.1.3 DBMS_XPLAN 35
3.1.4 解釋執行計劃 39
3.1.5 虛擬索引 43
3.2 跟蹤Oracle的執行 44
3.2.1 從當前會話中呼叫跟蹤 44
3.2.2 識別跟蹤檔案 45
3.2.3 獲取跟蹤狀態 45
3.2.4 在其他會話中呼叫跟蹤 46
3.2.5 通過MODULE、ACTION或SERVICE進行跟蹤 47
3.2.6 使用登入觸發器來啟用跟蹤 47
3.2.7 定位跟蹤檔案 48
3.2.8 其他特殊化的跟蹤 48
3.3 使用tkprof格式化跟蹤檔案 49
3.3.1 tkprof的排序選項 49
3.3.2 其他tkprof選項 50
3.3.3 合併多個SQL跟蹤檔案 51
3.3.4 解釋tkprof的輸出結果 51
3.3.5 tkprof中的執行計劃 53
3.3.6 等待統計資訊與tkprof 54
3.3.7 tkprof的替代品 54
3.4 在SQL*PLUS中使用AUTOTRACE 55
3.5 監控Oracle伺服器 56
3.5.1 V$表介面 56
3.5.2 等待介面 57
3.5.3 時間模型 59
3.5.4 整合時間模型與等待介面 61
3.5.5 Oracle企業管理器 62
3.5.6 SPOTLIGHT ON ORACLE 63
3.6 本章小結 64
第二部分 應用和資料庫設計
第4章 資料庫邏輯設計和物理設計 66
4.1 邏輯資料模型 66
4.1.1 標準化和第三正規化 66
4.1.2 資料型別選擇 67
4.1.3 人造鍵 67
4.1.4 資料倉庫設計 68
4.2 邏輯模型到物理模型的對映 68
4.2.1 將實體或類對映成表 69
4.2.2 選擇表的型別 71
4.2.3 資料型別和精度 71
4.2.4 可選的屬性和NULL值 72
4.2.5 列的順序 73
4.2.6 探索Oracle物件模型 73
4.3 反規範化 74
4.3.1 複製列值以避免表聯結 74
4.3.2 概要表 75
4.3.3 垂直分割槽 75
4.3.4 實施反規範化 76
4.4 星型模式設計 76
4.4.1 星型模式基礎 76
4.4.2 雪花模式 77
4.4.3 維度層次結構 79
4.4.4 聚集和物化檢視 80
4.4.5 物化檢視最佳實踐 81
4.5 物理儲存方案 82
4.5.1 資料段儲存手工管理和自動管理 82
4.5.2 並行插入和空閒塊連結串列 82
4.5.3 PCTFREE 與PCTUSED 83
4.5.4 壓縮 84
4.5.5 大資料欄位LOB的儲存 85
4.6 分割槽 86
4.6.1 分割槽的型別 86
4.6.2 組合分割槽 87
4.6.3 選擇一個分割槽策略 87
4.6.4 企業管理器的分割槽顧問 87
4.7 本章小結 89
第5章 索引與簇 91
5.1 Oracle索引與簇機制的概況 91
5.2 B*樹索引 91
5.2.1 索引選擇性 93
5.2.2 唯一索引 93
5.2.3 隱含索引 94
5.2.4 組合索引 94
5.2.5 索引跳躍掃描 95
5.2.6 建立組合索引的指導原則 96
5.2.7 索引合併 96
5.2.8 索引中的空值 97
5.2.9 反轉鍵(Reverse Key)索引 97
5.2.10 索引壓縮 98
5.2.11 函式索引 98
5.2.12 外來鍵與鎖 99
5.2.13 索引與分割槽 100
5.3 點陣圖索引 101
5.3.1 點陣圖索引的特性 101
5.3.2 點陣圖索引的缺陷 102
5.3.3 點陣圖索引與基數 103
5.3.4 點陣圖索引合併 104
5.3.5 點陣圖聯結索引 104
5.4 索引的開銷 106
5.5 索引組織表 109
5.5.1 配置溢位段 111
5.5.2 定期重建索引組織表(IOT) 114
5.6 簇 114
5.6.1 索引簇 114
5.6.2 雜湊簇 116
5.7 巢狀表 121
5.8 選擇最優的索引策略 123
5.9 本章小結 124
第6章 應用設計與實現 125
6.1 SQL語句管理 125
6.1.1 優化解析 125
6.1.2 避免執行不必要的SQL語句 129
6.2 批量介面 133
6.2.1 實現批量提取 133
6.2.2 批量插入 135
6.3 事務設計 135
6.3.1 隔離級別 136
6.3.2 事務與鎖 137
6.3.3 Oracle中的行級鎖 138
6.3.4 應用的鎖策略 139
6.4 使用儲存過程來降低網路流量 141
6.5 本章小結 145
第三部分 SQL和PL/SQL調優
第7章 優化器的優化 148
7.1 Oracle優化器 148
7.1.1 什麼是成本 148
7.1.2 優化器目標 149
7.1.3 選擇性和基數 149
7.1.4 查詢轉換 149
7.1.5 成本計算 150
7.1.6 物件統計資訊 151
7.1.7 直方圖 152
7.1.8 繫結變數窺探 154
7.1.9 自適應遊標共享 155
7.1.10 資料庫引數 156
7.1.11 系統統計資訊 159
7.1.12 收集統計資訊 160
7.2 使用DBMS_STAT 162
7.2.1 DBMS_STATS的儲存過程和引數 163
7.2.2 設定DBMS_STATS的系統預設值 165
7.2.3 使用METHOD_OPT建立直方圖 165
7.2.4 抽樣 166
7.2.5 分割槽統計資訊 167
7.2.6 擴充套件的統計資訊 167
7.2.7 鎖定統計資訊 169
7.2.8 系統統計資訊 170
7.2.9 匯出和匯入統計資訊 170
7.2.10 操縱統計資訊 170
7.3 本章小結 171
第8章 執行計劃管理 172
8.1 提示 172
8.1.1 使用提示來改變訪問路徑 174
8.1.2 使用提示來改變聯結順序 174
8.1.3 提示詳述中的錯誤 175
8.2 儲存提綱 175
8.2.1 建立儲存提綱以穩定執行計劃 176
8.2.2 侵入儲存提綱 177
8.3 SQL調優集 179
8.3.1 手動建立調優集 180
8.3.2 在企業管理器中建立調優集 181
8.4 SQL概要和SQL調優顧問 182
8.4.1 使用DBMS_SQLTUNE 183
8.4.2 索引建議 185
8.4.3 企業管理器中的SQL優化 186
8.4.4 使用SQL訪問顧問進行交叉SQL調優 187
8.5 SQL基線 189
8.5.1 建立基線 189
8.5.2 進化基線 191
8.5.3 自動化和配置基線 194
8.5.4 固化的基線 194
8.5.5 在ORACLE 企業管理器中管理基線 195
8.6 本章小結 195
第9章 表訪問調優 197
9.1 單值查詢 197
9.1.1 在表和索引掃描間選擇 198
9.1.2 點陣圖索引和單值查詢 201
9.1.3 雜湊聚簇和單值查詢 202
9.2 避免“意外的”表掃描 203
9.2.1 不等條件 203
9.2.2 空值查詢 205
9.2.3 查詢非空值 207
9.2.4 在可為空的列上建立索引 207
9.2.5 無意中通過使用函式而禁用了索引 208
9.2.6 函式索引 208
9.2.7 函式索引和統計 209
9.2.8 虛擬列 211
9.3 多列查詢 212
9.3.1 使用組合索引 212
9.3.2 索引合併 213
9.3.3 唯一性與覆蓋索引 213
9.4 查詢範圍 214
9.4.1 無界範圍掃描 214
9.4.2 有界範圍掃描 216
9.4.3 範圍查詢 217
9.5 使用LIKE運算子 219
9.6 多值單列查詢 220
9.7 優化必要的全表掃描 221
9.7.1 降低高水位線 221
9.7.2 優化PCTFREE和PCTUSED 222
9.7.3 減少記錄長度 223
9.7.4 壓縮表 223
9.7.5 使資料庫IO更高效 225
9.7.6 使用抽樣選項 225
9.7.7 並行查詢 226
9.7.8 快速全索引掃描 227
9.7.9 分割槽 228
9.8 本章小結 229
第10章 聯結與子查詢 231
10.1 聯結型別 231
10.2 聯結方法 232
10.2.1 巢狀迴圈聯結 232
10.2.2 排序合併聯結 233
10.2.3 雜湊聯結 234
10.3 選擇正確的聯結方法 235
10.3.1 排序合併/雜湊與巢狀迴圈的對比 235
10.3.2 排序合併和雜湊聯結對比 235
10.4 優化聯結 239
10.4.1 優化巢狀迴圈聯結 239
10.4.2 優化排序合併聯結與雜湊聯結 240
10.5 避免聯結 241
10.5.1 反正規化化 242
10.5.2 索引聚簇 242
10.5.3 物化檢視 243
10.5.4 點陣圖聯結索引 244
10.6 聯結順序 244
10.7 特殊聯結 246
10.7.1 外聯結 246
10.7.2 星型聯結 248
10.7.3 層級查詢 252
10.8 子查詢 254
10.8.1 簡單子查詢 254
10.8.2 關聯子查詢 256
10.8.3 反聯結子查詢 257
10.8.4 半聯結子查詢 259
10.9 本章小結 260
第11章 排序、分組與集合操作 261
11.1 排序操作 261
11.1.1 最優、一次和多次排序 262
11.1.2 衡量排序活動 263
11.1.3 跟蹤排序活動 264
11.1.4 使用索引規避排序 265
11.2 分組與聚合 267
11.2.1 聚合操作 267
11.2.2 最大值和最小值 268
11.2.3 “前N”查詢 269
11.2.4 計算一張表的記錄數 271
11.2.5 分組操作 271
11.2.6 HAVING與WHERE 273
11.3 集合操作 274
11.3.1 UNION與UNION ALL 275
11.3.2 INTERSECT 275
11.3.3 MINUS 277
11.3.4 集合操作和它們的替代方法 278
11.4 本章小結 279
第12章 使用和調優PL/SQL 280
12.1 PL/SQL的效能優勢 280
12.1.1 過程化的方法 280
12.1.2 減少網路開銷 280
12.1.3 分解並攻克海量的SQL語句 281
12.2 衡量PL/SQL的效能 281
12.2.1 衡量PL/SQL的開銷 281
12.2.2 使用DBMS_PROFILER 283
12.2.3 11g的分層剖析器 284
12.3 資料訪問優化 287
12.3.1 陣列處理和BULK COLLECT 287
12.3.2 對INSERT語句進行陣列處理 289
12.3.3 繫結變數和動態SQL 290
12.4 PL/SQL程式碼優化 292
12.4.1 首先調優SQL 292
12.4.2 PLSQL_OPTIMIZE_LEVEL 292
12.4.3 迴圈優化 293
12.4.4 “短路”表示式 295
12.4.5 在IF和CASE語句中表達式的順序 297
12.4.6 遞迴 298
12.4.7 NOCOPY子句 299
12.4.8 關聯陣列 301
12.5 其他優化 302
12.5.1 本地編譯 302
12.5.2 內聯PL/SQL 304
12.5.3 資料型別 306
12.5.4 使用JAVA計算 307
12.5.5 函式快取 308
12.6 DML觸發器的效能 309
12.6.1 UPDATE OF和WHEN子句 309
12.6.2 BEFORE和AFTER ROW觸發器 310
12.7 本章小結 311
第13章 並行SQL 312
13.1 理解並行SQL 312
13.1.1 並行程序和並行度 314
13.1.2 並行子程序池 315
13.1.3 並行查詢IO 316
13.1.4 並行效能收益 316
13.2 決定何時使用並行處理 317
13.2.1 伺服器計算機有多個CPU 318
13.2.2 被訪問的資料放置在多個磁碟驅動器上 318
13.2.3 使用並行的SQL是長時間執行的或者資源敏感的 318
13.2.4 SQL執行最少一次全表、索引或分割槽掃描 319
13.2.5 主機有空閒的能力 319
13.2.6 SQL是調優過的 319
13.3 配置並行處理 319
13.3.1 確定並行度 319
13.3.2 並行提示 321
13.3.3 並行配置的引數 321
13.4 監控並行SQL 323
13.4.1 並行語句的執行計劃 323
13.4.2 跟蹤並行執行 325
13.4.3 V$PQ_TQSTAT檢視 326
13.4.4 其他的統計資料 327
13.5 優化並行的效能 328
13.5.1 從一個優化過的序列執行的SQL開始 328
13.5.2 確保這個SQL適合並行執行 329
13.5.3 確保系統適合配置支援並行執行 329
13.5.4 確保執行計劃的所有部分都做了並行化 329
13.5.5 確保請求的並行度是可實現的 331
13.5.6 監控實際的並行度 331
13.5.7 檢查程序間資料和負載的偏差 332
13.6 其他的並行主題 333
13.6.1 RAC的並行執行 333
13.6.2 並行的索引查詢 334
13.6.3 並行DML 335
13.6.4 並行DDL 339
13.7 本章小結 340
第14章 DML調優 342
14.1 DML效能基礎 342
14.1.1 Where子句優化 342
14.1.2 索引開銷 343
14.1.3 觸發器開銷 344
14.1.4 參照完整性 345
14.2 INSERT操作的特定優化 346
14.2.1 批量處理 346
14.2.2 直接路徑插入 347
14.2.3 多表插入 349
14.2.4 手動段儲存管理(MSSM)和空閒列表 351
14.2.5 並行DML 351
14.3 刪除操作 351
14.3.1 TRUNCATE 351
14.3.2 分割槽 352
14.3.3 CREATE TABLE AS SELECT 352
14.4 更新和合並操作 353
14.4.1 關聯更新 353
14.4.2 優化MERGE操作 355
14.5 COMMIT優化 357
14.5.1 COMMIT頻率 358
14.5.2 批量和NOWAIT提交 358
14.5.3 NOLOGGING 360
14.6 本章小結 361
第四部分 最小化爭用
第15章 鎖爭用 364
15.1 鎖的型別和模式 364
15.2 等待鎖 367
15.3 監控和分析鎖 368
15.3.1 鎖等待的統計資料 368
15.3.2 發現導致鎖爭用的SQL 371
15.3.3 度量指定事務的鎖爭用 373
15.3.4 跟蹤鎖行為 375
15.3.5 阻塞者和等待者 376
15.4 應用程式的鎖策略 379
15.5 行級鎖什麼時候會失敗 380
15.5.1 沒有索引的外來鍵 380
15.5.2 事務表等待 381
15.5.3 點陣圖索引 382
15.5.4 直接路徑插入 383
15.6 系統鎖 383
15.6.1 高水位標記enqueue 384
15.6.2 空間事務enqueue 384
15.6.3 序列快取enqueue 384
15.6.4 使用者鎖enqueue 385
15.6.5 其他的系統鎖 385
15.7 本章小結 386
第16章 閂鎖和互斥爭用 387
16.1 閂鎖和互斥架構的簡介 387
16.1.1 GETS、SPINS和SLEEPS 388
16.1.2 互斥 388
16.2 度量和診斷閂鎖/互斥爭用 389
16.2.1 識別單個的閂鎖 390
16.2.2 發現與閂鎖等待相關的SQL和段 391
16.3 特定的閂鎖和互斥場景 392
16.3.1 Library Cache Mutex等待 393
16.3.2 Library Cache Pin 394
16.3.3 Shared Pool Latch 395
16.3.4 Cache Buffers Chains Latch 395
16.3.5 Row Cache Object閂鎖 397
16.3.6 其他的閂鎖場景 398
16.4 閂鎖爭用是不可避免的嗎 399
16.4.1 改變_SPIN_COUNT怎麼樣 399
16.4.2 自旋計數、閂鎖爭用和吞吐量 400
16.4.3 設定單個閂鎖的自旋計數 402
16.5 本章小結 402
第17章 共享記憶體爭用 404
17.1 緩衝區快取記憶體架構 404
17.2 空閒緩衝塊等待 406
17.2.1 DBWR直接和非同步IO 407
17.2.2 空閒緩衝塊等待的其他補救措施 409
17.3 恢復寫程序等待 410
17.3.1 提高閃回日誌IO 411
17.3.2 增加閃回日誌緩衝的大小 412
17.4 緩衝忙等待 414
17.4.1 度量緩衝忙 414
17.4.2 緩衝忙等待的傳統原因 414
17.4.3 緩衝忙和熱塊 415
17.5 重做日誌緩衝等待 417
17.6 本章小結 419
第五部分 優化記憶體
第18章 緩衝區快取記憶體調優 422
18.1 緩衝區快取記憶體的原理 422
18.1.1 最近最少使用列表 423
18.1.2 表掃描處理 423
18.1.3 CACHE屬性 424
18.1.4 直接路徑IO 424
18.2 緩衝區快取記憶體配置和調優 425
18.2.1 監控緩衝區快取記憶體 425
18.2.2 緩衝區快取記憶體命中率 426
18.2.3 多個緩衝區快取記憶體 428
18.2.4 設定緩衝區快取記憶體的大小 430
18.3 自動共享記憶體管理 433
18.3.1 實現ASMM 433
18.3.2 監控重設大小操作 434
18.3.3 調優ASMM 435
18.3.4 非預設池 436
18.3.5 記憶體抖動 437
18.4 本章小結 439
第19章 優化PGA記憶體 440
19.1 IO和PGA記憶體 440
19.2 PGA記憶體管理 441
19.2.1 PGA_AGGREGATE_TARGET 441
19.2.2 會話的PGA限制 442
19.3 測量PGA的使用和效率 443
19.3.1 會話的PGA利用率 445
19.3.2 測量臨時IO等待時間 446
19.3.3 測量工作區活動 448
19.4 用V$PGA_TARGET_ADVICE來設定PGA的大小 449
19.5 覆寫PGA總量目標 452
19.6 本章小結 454
第20章 其他的記憶體管理主題 455
20.1 優化整體的Oracle記憶體 455
20.1.1 IO等待時間和記憶體優化 455
20.1.2 使用顧問來分配PGA和緩衝區快取記憶體的記憶體 458
20.1.3 Oracle 11g的自動化記憶體管理 464
20.2 結果集快取 470
20.2.1 啟用和配置結果集快取 471
20.2.2 結果集快取的統計資料 471
20.2.3 結果集快取的依賴 474
20.2.4 結果集快取閂鎖 474
20.3 其他的記憶體優化 476
20.3.1 設定共享池的大小 476
20.3.2 設定大池的大小 478
20.3.3 重做日誌快取 478
20.3.4 鎖定SGA 478
20.4 本章小結 479
第六部分 IO調優和叢集
第21章 磁碟IO調優基礎 482
21.1 磁碟IO的概念 482
21.1.1 服務時間和吞吐量 482
21.1.2 排隊 483
21.1.3 磁碟驅動器:慢和正在變得更慢 483
21.1.4 磁碟容量和資料分佈 484
21.2 Oracle IO架構 484
21.2.1 資料檔案單塊讀 485
21.2.2 多塊讀 485
21.2.3 直接路徑讀 486
21.2.4 臨時直接路徑IO 486
21.2.5 資料檔案寫IO 486
21.2.6 直接路徑寫 487
21.2.7 重做日誌IO 487
21.2.8 歸檔日誌IO 487
21.2.9 閃回IO 488
21.2.10 控制檔案IO 488
21.3 度量和監控Oracle IO 488
21.3.1 IO等待次數 488
21.3.2 監控資料檔案IO 492
21.3.3 IO基準測試 494
21.4 優化資料檔案IO 495
21.4.1 最小化IO延時 495
21.4.2 最大化IO吞吐量 496
21.4.3 條帶化策略 497
21.4.4 RAID陣列 497
21.4.5 隔離資料檔案IO 500
21.5 重做和歸檔優化 500
21.5.1 交替和分發日誌 501
21.5.2 重做和歸檔裝置的細粒度條帶化 501
21.5.3 對重做日誌使用RAID5大聲說不 502
21.5.4 重做日誌大小 503
21.6 閃回日誌 506
21.7 本章小結 507
第22章 高階IO技術 508
22.1 自動儲存管理 508
22.1.1 ASM架構 509
22.1.2 ASM監控 510
22.1.3 ASM調優 515
22.2 固態磁碟(SSD) 520
22.2.1 基於快閃記憶體的SSD 520
22.2.2 基於隨機儲存器的DDR
SSD 520
22.2.3 混合的SSD 521
22.2.4 為Oracle資料庫使用SSD 521
22.3 EXADATA儲存伺服器 522
22.4 資料庫塊大小 522
22.5 本章小結 524
第23章 優化RAC 525
23.1 RAC概覽 525
23.1.1 全域性快取請求 526
23.1.2 RAC調優原則 528
23.1.3 單例項調優和RAC 528
23.2 度量叢集開銷 529
23.3 減少全域性快取延時 532
23.3.1 度量全域性快取延時 532
23.3.2 檢查內部互連 534
23.3.3 內部互連問題的訊號 536
23.4 優化內部互連 537
23.4.1 網路硬體和協議 537
23.4.2 乙太網特大幀 537
23.4.3 UDP緩衝大小 538
23.4.4 LMS等待 539
23.5 叢集負載均衡 541
23.5.1 評估叢集負載均衡 541
23.5.2 叢集負載均衡和服務 544
23.5.3 RAC負載均衡服務 547
23.6 最小化全域性快取請求 548
23.6.1 高的全域性快取請求比例的原因 548
23.6.2 度量全域性快取請求比例 549
23.6.3 減少全域性快取請求的技巧 550
23.7 本章小結 551
參考書目 552
第一部分 方法、概念和工具
第1章 Oracle效能調優:一種系統化方法 2
1.1 Oracle效能調優簡史 3
1.2 超越表面分析法 3
1.3 第一階段:最小化應用負載 5
1.4 第二階段:降低爭用和瓶頸 6
1.5 第三階段:降低物理IO 7
1.6 第四階段:優化磁碟IO 8
1.7 本章小結 9
第2章 Oracle體系結構與基本概念 11
2.1 Oracle API 11
2.1.1 建立遊標 13
2.1.2 檢查快取的SQL語句 13
2.1.3 解析SQL語句 13
2.1.4 關聯繫結變數 14
2.1.5 執行SQL語句 15
2.1.6 提取記錄 15
2.1.7 使用批量提取 15
2.1.8 處理結果集 16
2.1.9 關閉遊標 16
2.1.10 優化Oracle API呼叫 16
2.2 Oracle查詢優化器 16
2.2.1 基於成本的優化 17
2.2.2 優化器目標 18
2.2.3 優化器統計資訊 18
2.2.4 繫結變數窺視與自適應遊標共享 19
2.2.5 提示 19
2.2.6 儲存概要、SQL概要和SQL計劃基線 19
2.3 事務和鎖 20
2.4 Oracle伺服器體系結構 20
2.4.1 例項與資料庫 21
2.4.2 系統全域性區 22
2.4.3 資料快取 22
2.4.4 程式全域性區 22
2.4.5 記憶體管理 23
2.5 段與檔案 23
2.5.1 表 23
2.5.2 索引 24
2.5.3 塊、區間、段以及分割槽 24
2.5.4 表空間與資料檔案 25
2.5.5 回滾段 25
2.5.6 重做日誌與歸檔日誌 25
2.5.7 閃回日誌 25
2.6 伺服器程序 26
2.7 後臺程序 26
2.8 真正應用叢集 27
2.9 本章小結 28
第3章 實用工具 29
3.1 生成SQL語句的執行計劃 29
3.1.1 計劃表 30
3.1.2 研究快取的SQL 33
3.1.3 DBMS_XPLAN 35
3.1.4 解釋執行計劃 39
3.1.5 虛擬索引 43
3.2 跟蹤Oracle的執行 44
3.2.1 從當前會話中呼叫跟蹤 44
3.2.2 識別跟蹤檔案 45
3.2.3 獲取跟蹤狀態 45
3.2.4 在其他會話中呼叫跟蹤 46
3.2.5 通過MODULE、ACTION或SERVICE進行跟蹤 47
3.2.6 使用登入觸發器來啟用跟蹤 47
3.2.7 定位跟蹤檔案 48
3.2.8 其他特殊化的跟蹤 48
3.3 使用tkprof格式化跟蹤檔案 49
3.3.1 tkprof的排序選項 49
3.3.2 其他tkprof選項 50
3.3.3 合併多個SQL跟蹤檔案 51
3.3.4 解釋tkprof的輸出結果 51
3.3.5 tkprof中的執行計劃 53
3.3.6 等待統計資訊與tkprof 54
3.3.7 tkprof的替代品 54
3.4 在SQL*PLUS中使用AUTOTRACE 55
3.5 監控Oracle伺服器 56
3.5.1 V$表介面 56
3.5.2 等待介面 57
3.5.3
3.5.4 整合時間模型與等待介面 61
3.5.5 Oracle企業管理器 62
3.5.6 SPOTLIGHT ON ORACLE 63
3.6 本章小結 64
第二部分 應用和資料庫設計
第4章 資料庫邏輯設計和物理設計 66
4.1 邏輯資料模型 66
4.1.1 標準化和第三正規化 66
4.1.2 資料型別選擇 67
4.1.3 人造鍵 67
4.1.4 資料倉庫設計 68
4.2 邏輯模型到物理模型的對映 68
4.2.1 將實體或類對映成表 69
4.2.2 選擇表的型別 71
4.2.3 資料型別和精度 71
4.2.4 可選的屬性和NULL值 72
4.2.5 列的順序 73
4.2.6 探索Oracle物件模型 73
4.3 反規範化 74
4.3.1 複製列值以避免表聯結 74
4.3.2 概要表 75
4.3.3 垂直分割槽 75
4.3.4 實施反規範化 76
4.4 星型模式設計 76
4.4.1 星型模式基礎 76
4.4.2 雪花模式 77
4.4.3 維度層次結構 79
4.4.4 聚集和物化檢視 80
4.4.5 物化檢視最佳實踐 81
4.5 物理儲存方案 82
4.5.1 資料段儲存手工管理和自動管理 82
4.5.2 並行插入和空閒塊連結串列 82
4.5.3 PCTFREE 與PCTUSED 83
4.5.4 壓縮 84
4.5.5 大資料欄位LOB的儲存 85
4.6 分割槽 86
4.6.1 分割槽的型別 86
4.6.2 組合分割槽 87
4.6.3 選擇一個分割槽策略 87
4.6.4 企業管理器的分割槽顧問 87
4.7 本章小結 89
第5章 索引與簇 91
5.1 Oracle索引與簇機制的概況 91
5.2 B*樹索引 91
5.2.1 索引選擇性 93
5.2.2 唯一索引 93
5.2.3 隱含索引 94
5.2.4 組合索引 94
5.2.5 索引跳躍掃描 95
5.2.6 建立組合索引的指導原則 96
5.2.7 索引合併 96
5.2.8 索引中的空值 97
5.2.9 反轉鍵(Reverse Key)索引 97
5.2.10 索引壓縮 98
5.2.11 函式索引 98
5.2.12 外來鍵與鎖 99
5.2.13 索引與分割槽 100
5.3 點陣圖索引 101
5.3.1 點陣圖索引的特性 101
5.3.2 點陣圖索引的缺陷 102
5.3.3 點陣圖索引與基數 103
5.3.4 點陣圖索引合併 104
5.3.5 點陣圖聯結索引 104
5.4 索引的開銷 106
5.5 索引組織表 109
5.5.1 配置溢位段 111
5.5.2 定期重建索引組織表(IOT) 114
5.6 簇 114
5.6.1 索引簇 114
5.6.2 雜湊簇 116
5.7 巢狀表 121
5.8 選擇最優的索引策略 123
5.9 本章小結 124
第6章 應用設計與實現 125
6.1 SQL語句管理 125
6.1.1 優化解析 125
6.1.2 避免執行不必要的SQL語句 129
6.2 批量介面 133
6.2.1 實現批量提取 133
6.2.2 批量插入 135
6.3 事務設計 135
6.3.1 隔離級別 136
6.3.2 事務與鎖 137
6.3.3 Oracle中的行級鎖 138
6.3.4 應用的鎖策略 139
6.4 使用儲存過程來降低網路流量 141
6.5 本章小結 145
第三部分 SQL和PL/SQL調優
第7章 優化器的優化 148
7.1 Oracle優化器 148
7.1.1 什麼是成本 148
7.1.2 優化器目標 149
7.1.3 選擇性和基數 149
7.1.4 查詢轉換 149
7.1.5 成本計算 150
7.1.6 物件統計資訊 151
7.1.7 直方圖 152
7.1.8 繫結變數窺探 154
7.1.9 自適應遊標共享 155
7.1.10 資料庫引數 156
7.1.11 系統統計資訊 159
7.1.12 收集統計資訊 160
7.2 使用DBMS_STAT 162
7.2.1 DBMS_STATS的儲存過程和引數 163
7.2.2 設定DBMS_STATS的系統預設值 165
7.2.3 使用METHOD_OPT建立直方圖 165
7.2.4 抽樣 166
7.2.5 分割槽統計資訊 167
7.2.6 擴充套件的統計資訊 167
7.2.7 鎖定統計資訊 169
7.2.8 系統統計資訊 170
7.2.9 匯出和匯入統計資訊 170
7.2.10 操縱統計資訊 170
7.3 本章小結 171
第8章 執行計劃管理 172
8.1 提示 172
8.1.1 使用提示來改變訪問路徑 174
8.1.2 使用提示來改變聯結順序 174
8.1.3 提示詳述中的錯誤 175
8.2 儲存提綱 175
8.2.1 建立儲存提綱以穩定執行計劃 176
8.2.2 侵入儲存提綱 177
8.3 SQL調優集 179
8.3.1 手動建立調優集 180
8.3.2 在企業管理器中建立調優集 181
8.4 SQL概要和SQL調優顧問 182
8.4.1 使用DBMS_SQLTUNE 183
8.4.2 索引建議 185
8.4.3 企業管理器中的SQL優化 186
8.4.4 使用SQL訪問顧問進行交叉SQL調優 187
8.5 SQL基線 189
8.5.1 建立基線 189
8.5.2 進化基線 191
8.5.3 自動化和配置基線 194
8.5.4 固化的基線 194
8.5.5 在ORACLE 企業管理器中管理基線 195
8.6 本章小結 195
第9章 表訪問調優 197
9.1 單值查詢 197
9.1.1 在表和索引掃描間選擇 198
9.1.2 點陣圖索引和單值查詢 201
9.1.3 雜湊聚簇和單值查詢 202
9.2 避免“意外的”表掃描 203
9.2.1 不等條件 203
9.2.2 空值查詢 205
9.2.3 查詢非空值 207
9.2.4 在可為空的列上建立索引 207
9.2.5 無意中通過使用函式而禁用了索引 208
9.2.6 函式索引 208
9.2.7 函式索引和統計 209
9.2.8 虛擬列 211
9.3 多列查詢 212
9.3.1 使用組合索引 212
9.3.2 索引合併 213
9.3.3 唯一性與覆蓋索引 213
9.4 查詢範圍 214
9.4.1 無界範圍掃描 214
9.4.2 有界範圍掃描 216
9.4.3 範圍查詢 217
9.5 使用LIKE運算子 219
9.6 多值單列查詢 220
9.7 優化必要的全表掃描 221
9.7.1 降低高水位線 221
9.7.2 優化PCTFREE和PCTUSED 222
9.7.3 減少記錄長度 223
9.7.4 壓縮表 223
9.7.5 使資料庫IO更高效 225
9.7.6 使用抽樣選項 225
9.7.7 並行查詢 226
9.7.8 快速全索引掃描 227
9.7.9 分割槽 228
9.8 本章小結 229
第10章 聯結與子查詢 231
10.1 聯結型別 231
10.2 聯結方法 232
10.2.1 巢狀迴圈聯結 232
10.2.2 排序合併聯結 233
10.2.3 雜湊聯結 234
10.3 選擇正確的聯結方法 235
10.3.1 排序合併/雜湊與巢狀迴圈的對比 235
10.3.2 排序合併和雜湊聯結對比 235
10.4 優化聯結 239
10.4.1 優化巢狀迴圈聯結 239
10.4.2 優化排序合併聯結與雜湊聯結 240
10.5 避免聯結 241
10.5.1 反正規化化 242
10.5.2 索引聚簇 242
10.5.3 物化檢視 243
10.5.4 點陣圖聯結索引 244
10.6 聯結順序 244
10.7 特殊聯結 246
10.7.1 外聯結 246
10.7.2 星型聯結 248
10.7.3 層級查詢 252
10.8 子查詢 254
10.8.1 簡單子查詢 254
10.8.2 關聯子查詢 256
10.8.3 反聯結子查詢 257
10.8.4 半聯結子查詢 259
10.9 本章小結 260
第11章 排序、分組與集合操作 261
11.1 排序操作 261
11.1.1 最優、一次和多次排序 262
11.1.2 衡量排序活動 263
11.1.3 跟蹤排序活動 264
11.1.4 使用索引規避排序 265
11.2 分組與聚合 267
11.2.1 聚合操作 267
11.2.2 最大值和最小值 268
11.2.3 “前N”查詢 269
11.2.4 計算一張表的記錄數 271
11.2.5 分組操作 271
11.2.6 HAVING與WHERE 273
11.3 集合操作 274
11.3.1 UNION與UNION ALL 275
11.3.2 INTERSECT 275
11.3.3 MINUS 277
11.3.4 集合操作和它們的替代方法 278
11.4 本章小結 279
第12章 使用和調優PL/SQL 280
12.1 PL/SQL的效能優勢 280
12.1.1 過程化的方法 280
12.1.2 減少網路開銷 280
12.1.3 分解並攻克海量的SQL語句 281
12.2 衡量PL/SQL的效能 281
12.2.1 衡量PL/SQL的開銷 281
12.2.2 使用DBMS_PROFILER 283
12.2.3 11g的分層剖析器 284
12.3 資料訪問優化 287
12.3.1 陣列處理和BULK COLLECT 287
12.3.2 對INSERT語句進行陣列處理 289
12.3.3 繫結變數和動態SQL 290
12.4 PL/SQL程式碼優化 292
12.4.1 首先調優SQL 292
12.4.2 PLSQL_OPTIMIZE_LEVEL 292
12.4.3 迴圈優化 293
12.4.4 “短路”表示式 295
12.4.5 在IF和CASE語句中表達式的順序 297
12.4.6 遞迴 298
12.4.7 NOCOPY子句 299
12.4.8 關聯陣列 301
12.5 其他優化 302
12.5.1 本地編譯 302
12.5.2 內聯PL/SQL 304
12.5.3 資料型別 306
12.5.4 使用JAVA計算 307
12.5.5 函式快取 308
12.6 DML觸發器的效能 309
12.6.1 UPDATE OF和WHEN子句 309
12.6.2 BEFORE和AFTER ROW觸發器 310
12.7 本章小結 311
第13章 並行SQL 312
13.1 理解並行SQL 312
13.1.1 並行程序和並行度 314
13.1.2 並行子程序池 315
13.1.3 並行查詢IO 316
13.1.4 並行效能收益 316
13.2 決定何時使用並行處理 317
13.2.1 伺服器計算機有多個CPU 318
13.2.2 被訪問的資料放置在多個磁碟驅動器上 318
13.2.3 使用並行的SQL是長時間執行的或者資源敏感的 318
13.2.4 SQL執行最少一次全表、索引或分割槽掃描 319
13.2.5 主機有空閒的能力 319
13.2.6 SQL是調優過的 319
13.3 配置並行處理 319
13.3.1 確定並行度 319
13.3.2 並行提示 321
13.3.3 並行配置的引數 321
13.4 監控並行SQL 323
13.4.1 並行語句的執行計劃 323
13.4.2 跟蹤並行執行 325
13.4.3 V$PQ_TQSTAT檢視 326
13.4.4 其他的統計資料 327
13.5 優化並行的效能 328
13.5.1 從一個優化過的序列執行的SQL開始 328
13.5.2 確保這個SQL適合並行執行 329
13.5.3 確保系統適合配置支援並行執行 329
13.5.4 確保執行計劃的所有部分都做了並行化 329
13.5.5 確保請求的並行度是可實現的 331
13.5.6 監控實際的並行度 331
13.5.7 檢查程序間資料和負載的偏差 332
13.6 其他的並行主題 333
13.6.1 RAC的並行執行 333
13.6.2 並行的索引查詢 334
13.6.3 並行DML 335
13.6.4 並行DDL 339
13.7 本章小結 340
第14章 DML調優 342
14.1 DML效能基礎 342
14.1.1 Where子句優化 342
14.1.2 索引開銷 343
14.1.3 觸發器開銷 344
14.1.4 參照完整性 345
14.2 INSERT操作的特定優化 346
14.2.1 批量處理 346
14.2.2 直接路徑插入 347
14.2.3 多表插入 349
14.2.4 手動段儲存管理(MSSM)和空閒列表 351
14.2.5 並行DML 351
14.3 刪除操作 351
14.3.1 TRUNCATE 351
14.3.2 分割槽 352
14.3.3 CREATE TABLE AS SELECT 352
14.4 更新和合並操作 353
14.4.1 關聯更新 353
14.4.2 優化MERGE操作 355
14.5 COMMIT優化 357
14.5.1 COMMIT頻率 358
14.5.2 批量和NOWAIT提交 358
14.5.3 NOLOGGING 360
14.6 本章小結 361
第四部分 最小化爭用
第15章 鎖爭用 364
15.1 鎖的型別和模式 364
15.2 等待鎖 367
15.3 監控和分析鎖 368
15.3.1 鎖等待的統計資料 368
15.3.2 發現導致鎖爭用的SQL 371
15.3.3 度量指定事務的鎖爭用 373
15.3.4 跟蹤鎖行為 375
15.3.5 阻塞者和等待者 376
15.4 應用程式的鎖策略 379
15.5 行級鎖什麼時候會失敗 380
15.5.1 沒有索引的外來鍵 380
15.5.2 事務表等待 381
15.5.3 點陣圖索引 382
15.5.4 直接路徑插入 383
15.6 系統鎖 383
15.6.1 高水位標記enqueue 384
15.6.2 空間事務enqueue 384
15.6.3 序列快取enqueue 384
15.6.4 使用者鎖enqueue 385
15.6.5 其他的系統鎖 385
15.7 本章小結 386
第16章 閂鎖和互斥爭用 387
16.1 閂鎖和互斥架構的簡介 387
16.1.1 GETS、SPINS和SLEEPS 388
16.1.2 互斥 388
16.2 度量和診斷閂鎖/互斥爭用 389
16.2.1 識別單個的閂鎖 390
16.2.2 發現與閂鎖等待相關的SQL和段 391
16.3 特定的閂鎖和互斥場景 392
16.3.1 Library Cache Mutex等待 393
16.3.2 Library Cache Pin 394
16.3.3 Shared Pool Latch 395
16.3.4 Cache Buffers Chains Latch 395
16.3.5 Row Cache Object閂鎖 397
16.3.6 其他的閂鎖場景 398
16.4 閂鎖爭用是不可避免的嗎 399
16.4.1 改變_SPIN_COUNT怎麼樣 399
16.4.2 自旋計數、閂鎖爭用和吞吐量 400
16.4.3 設定單個閂鎖的自旋計數 402
16.5 本章小結 402
第17章 共享記憶體爭用 404
17.1 緩衝區快取記憶體架構 404
17.2 空閒緩衝塊等待 406
17.2.1 DBWR直接和非同步IO 407
17.2.2 空閒緩衝塊等待的其他補救措施 409
17.3 恢復寫程序等待 410
17.3.1 提高閃回日誌IO 411
17.3.2 增加閃回日誌緩衝的大小 412
17.4 緩衝忙等待 414
17.4.1 度量緩衝忙 414
17.4.2 緩衝忙等待的傳統原因 414
17.4.3 緩衝忙和熱塊 415
17.5 重做日誌緩衝等待 417
17.6 本章小結 419
第五部分 優化記憶體
第18章 緩衝區快取記憶體調優 422
18.1 緩衝區快取記憶體的原理 422
18.1.1 最近最少使用列表 423
18.1.2 表掃描處理 423
18.1.3 CACHE屬性 424
18.1.4 直接路徑IO 424
18.2 緩衝區快取記憶體配置和調優 425
18.2.1 監控緩衝區快取記憶體 425
18.2.2 緩衝區快取記憶體命中率 426
18.2.3 多個緩衝區快取記憶體 428
18.2.4 設定緩衝區快取記憶體的大小 430
18.3 自動共享記憶體管理 433
18.3.1 實現ASMM 433
18.3.2 監控重設大小操作 434
18.3.3 調優ASMM 435
18.3.4 非預設池 436
18.3.5 記憶體抖動 437
18.4 本章小結 439
第19章 優化PGA記憶體 440
19.1 IO和PGA記憶體 440
19.2 PGA記憶體管理 441
19.2.1 PGA_AGGREGATE_TARGET 441
19.2.2 會話的PGA限制 442
19.3 測量PGA的使用和效率 443
19.3.1 會話的PGA利用率 445
19.3.2 測量臨時IO等待時間 446
19.3.3 測量工作區活動 448
19.4 用V$PGA_TARGET_ADVICE來設定PGA的大小 449
19.5 覆寫PGA總量目標 452
19.6 本章小結 454
第20章 其他的記憶體管理主題 455
20.1 優化整體的Oracle記憶體 455
20.1.1 IO等待時間和記憶體優化 455
20.1.2 使用顧問來分配PGA和緩衝區快取記憶體的記憶體 458
20.1.3 Oracle 11g的自動化記憶體管理 464
20.2 結果集快取 470
20.2.1 啟用和配置結果集快取 471
20.2.2 結果集快取的統計資料 471
20.2.3 結果集快取的依賴 474
20.2.4 結果集快取閂鎖 474
20.3 其他的記憶體優化 476
20.3.1 設定共享池的大小 476
20.3.2 設定大池的大小 478
20.3.3 重做日誌快取 478
20.3.4 鎖定SGA 478
20.4 本章小結 479
第六部分 IO調優和叢集
第21章 磁碟IO調優基礎 482
21.1 磁碟IO的概念 482
21.1.1 服務時間和吞吐量 482
21.1.2 排隊 483
21.1.3 磁碟驅動器:慢和正在變得更慢 483
21.1.4 磁碟容量和資料分佈 484
21.2 Oracle IO架構 484
21.2.1 資料檔案單塊讀 485
21.2.2 多塊讀 485
21.2.3 直接路徑讀 486
21.2.4 臨時直接路徑IO 486
21.2.5 資料檔案寫IO 486
21.2.6 直接路徑寫 487
21.2.7 重做日誌IO 487
21.2.8 歸檔日誌IO 487
21.2.9 閃回IO 488
21.2.10 控制檔案IO 488
21.3 度量和監控Oracle IO 488
21.3.1 IO等待次數 488
21.3.2 監控資料檔案IO 492
21.3.3 IO基準測試 494
21.4 優化資料檔案IO 495
21.4.1 最小化IO延時 495
21.4.2 最大化IO吞吐量 496
21.4.3 條帶化策略 497
21.4.4 RAID陣列 497
21.4.5 隔離資料檔案IO 500
21.5 重做和歸檔優化 500
21.5.1 交替和分發日誌 501
21.5.2 重做和歸檔裝置的細粒度條帶化 501
21.5.3 對重做日誌使用RAID5大聲說不 502
21.5.4 重做日誌大小 503
21.6 閃回日誌 506
21.7 本章小結 507
第22章 高階IO技術 508
22.1 自動儲存管理 508
22.1.1 ASM架構 509
22.1.2 ASM監控 510
22.1.3 ASM調優 515
22.2 固態磁碟(SSD) 520
22.2.1 基於快閃記憶體的SSD 520
22.2.2 基於隨機儲存器的DDR
SSD 520
22.2.3 混合的SSD 521
22.2.4 為Oracle資料庫使用SSD 521
22.3 EXADATA儲存伺服器 522
22.4 資料庫塊大小 522
22.5 本章小結 524
第23章 優化RAC 525
23.1 RAC概覽 525
23.1.1 全域性快取請求 526
23.1.2 RAC調優原則 528
23.1.3 單例項調優和RAC 528
23.2 度量叢集開銷 529
23.3 減少全域性快取延時 532
23.3.1 度量全域性快取延時 532
23.3.2 檢查內部互連 534
23.3.3 內部互連問題的訊號 536
23.4 優化內部互連 537
23.4.1 網路硬體和協議 537
23.4.2 乙太網特大幀 537
23.4.3 UDP緩衝大小 538
23.4.4 LMS等待 539
23.5 叢集負載均衡 541
23.5.1 評估叢集負載均衡 541
23.5.2 叢集負載均衡和服務 544
23.5.3 RAC負載均衡服務 547
23.6 最小化全域性快取請求 548
23.6.1 高的全域性快取請求比例的原因 548
23.6.2 度量全域性快取請求比例 549
23.6.3 減少全域性快取請求的技巧 550
23.7 本章小結 551
參考書目 552