內容介紹
無論你是開發人員還是DBA,要創建和管理穩定、高質量的Oracle系統,歸根結底都需要理解Oracle資料庫的體系結構。本書是公認的Oracle資料庫權威指南,凝聚了世界頂尖的Oracle專家Thomas Kyte數十年的寶貴經驗和真知灼見。書中深入分析了Oracle資料庫體系結構,包括檔案、記憶體結構以及構成Oracle資料庫和實例的底層進程,利用具體示例討論了一些重要的資料庫主題,如鎖定、並發控制、事務等。同時分析了資料庫中的物理結構,如表、索引和數據類型,並介紹採用哪些技術能最優地使用這些物理結構。本書在上一版的基礎上做了大量增補,以涵蓋11g最受關注的多項特性,尤其針對數據加密的途徑進行了詳細的闡釋。
作者介紹
Thomas KyteOracle公司核心技術集團副總裁。從5.1.1c版本開始使用Oracle,自7.0.9版本發布就一直任職於Oracle公司,幫助Oracle資料庫用戶設計和構建系統,或者對系統進行重構和調優。此前曾是一位系統集成師,主要為美國軍方和政府部門的客戶構建大規模的異構資料庫和套用。長期主持Oracle Magazine “Ask Tom”專欄,熱心回答困擾全世界Oracle開發人員和DBA的各種問題。除本書外,還著有廣受好評的《Oracle專家高級編程》和《Oracle高效設計》。作品目錄
第1章 開發成功的Oracle套用 11.1 我的方法 2
1.2 黑盒方法 3
1.3 開發資料庫套用的正確(和不正確)方法 10
1.3.1 了解Oracle體系結構 11
1.3.2 理解並發控制 19
1.3.3 多版本控制 22
1.3.4 資料庫獨立性 28
1.3.5 怎么能讓套用運行得更快 42
1.3.6 DBA與開發人員的關係 44
1.4 小結 45
第2章 體系結構概述 46
2.1 定義資料庫和實例 47
2.2 SGA和後台進程 52
2.3 連線Oracle 54
2.3.1 專用伺服器 54
2.3.2 共享伺服器 56
2.3.3 TCP/IP連線的基本原理 57
2.4 小結 59
第3章 檔案 60
3.1 參數檔案 61
3.1.1 什麼是參數 62
3.1.2 遺留的init.ora參數檔案 65
3.1.3 伺服器參數檔案 67
3.1.4 參數檔案小結 72
3.2 跟蹤檔案 73
3.2.1 請求的跟蹤檔案 74
3.2.2 針對內部錯誤生成的跟蹤檔案 78
3.2.3 跟蹤檔案小結 82
3.3 警告檔案 83
3.4 數據檔案 85
3.4.1 簡要回顧檔案系統機制 86
3.4.2 Oracle資料庫中的存儲層次體系 87
3.4.3 字典管理和本地管理的表空間 90
3.5 臨時檔案 92
3.6 控制檔案 94
3.7 重做日誌檔案 94
3.7.1 線上重做日誌 95
3.7.2 歸檔重做日誌 97
3.8 密碼檔案 99
3.9 修改跟蹤檔案 102
3.10 閃回日誌 103
3.10.1 閃回資料庫 103
3.10.2 閃回恢復區 104
3.11 DMP檔案(EXP/IMP檔案) 104
3.12 數據泵檔案 105
3.13 平面檔案 108
3.14 小結 109
第4章 記憶體結構 110
4.1 進程全局區和用戶全局區 110
4.1.1 手動PGA記憶體管理 111
4.1.2 自動PGA記憶體管理 117
4.1.3 手動和自動記憶體管理的選擇 127
4.1.4 PGA和UGA小結 129
4.2 系統全局區 129
4.2.1 固定SGA 133
4.2.2 重做緩衝區 134
4.2.3 塊緩衝區快取 135
4.2.4 共享池 141
4.2.5 大池 143
4.2.6 Java池 144
4.2.7 流池 145
4.2.8 自動SGA記憶體管理 145
4.2.9 自動記憶體管理 147
4.3 小結 148
第5章 Oracle進程 149
5.1 伺服器進程 149
5.1.1 專用伺服器連線 150
5.1.2 共享伺服器連線 152
5.1.3 資料庫常駐連線池 152
5.1.4 連線與會話 153
5.1.5 專用伺服器與共享伺服器 158
5.1.6 專用/共享伺服器小結 161
5.2 後台進程 162
5.2.1 中心後台進程 163
5.2.2 工具後台進程 171
5.3 從屬進程 173
5.3.1 I/O從屬進程 173
5.3.2 Pnnn:並行查詢執行伺服器 174
5.4 小結 175
第6章 鎖和閂 176
6.1 什麼是鎖 176
6.2 鎖定問題 179
6.2.1 丟失更新 179
6.2.2 悲觀鎖定 180
6.2.3 樂觀鎖定 182
6.2.4 樂觀鎖定還是悲觀鎖定 188
6.2.5 阻塞 188
6.2.6 死鎖 191
6.2.7 鎖升級 195
6.3 鎖類型 195
6.3.1 DML鎖 196
6.3.2 DDL鎖 204
6.3.3 閂 209
6.3.4 手動鎖定和用戶定義鎖 217
6.4 小結 218
第7章 並發與多版本控制 219
7.1 什麼是並發控制 219
7.2 事務隔離級別 220
7.2.1 READ UNCOMMITTED 221
7.2.2 READ COMMITTED 223
7.2.3 REPEATABLE READ 224
7.2.4 SERIALIZABLE 226
7.2.5 READ ONLY 228
7.3 多版本控制讀一致性的含義 229
7.3.1 一種會失敗的常用數據倉庫技術 229
7.3.2 解釋熱表上超出期望的I/O 230
7.4 寫一致性 233
7.4.1 一致讀和當前讀 233
7.4.2 查看重啟動 235
7.4.3 為什麼重啟動對我們很重要 238
7.5 小結 239
第8章 事務 240
8.1 事務控制語句 240
8.2 原子性 242
8.2.1 語句級原子性 242
8.2.2 過程級原子性 244
8.2.3 事務級原子性 247
8.2.4 DDL與原子性 247
8.3 持久性 247
8.3.1 COMMIT的WRITE擴展 248
8.3.2 非分散式PL/SQL代碼塊中的COMMIT 249
8.4 完整性約束和事務 250
8.4.1 IMMEDIATE約束 251
8.4.2 DEFERRABLE約束和級聯更新 251
8.5 不好的事務習慣 255
8.5.1 在循環中提交 255
8.5.2 使用自動提交 261
8.6 分散式事務 261
8.7 自治事務 263
8.7.1 自治事務如何工作 264
8.7.2 何時使用自治事務 265
8.8 小結 268
第9章 redo與undo 269
9.1 什麼是redo 269
9.2 什麼是undo 270
9.3 redo和undo如何協作 273
9.4 提交和回滾處理 277
9.4.1 COMMIT做什麼 277
9.4.2 ROLLBACK做什麼 283
9.5 分析redo 284
9.5.1 測量redo 284
9.5.2 能關掉重做日誌生成程式嗎 286
9.5.3 為什麼不能分配一個新日誌 289
9.5.4 塊清除 291
9.5.5 日誌競爭 294
9.5.6 臨時表和redo/undo 296
9.6 分析undo 299
9.6.1 什麼操作會生成最多和最少的undo 299
9.6.2 ORA-01555: snapshot too old 錯誤 301
9.7 小結 310
第10章 資料庫表 311
10.1 表類型 311
10.2 術語 313
10.2.1 段 313
10.2.2 段空間管理 315
10.2.3 高水位線 316
10.2.4 FREELIST 317
10.2.5 PCTFREE和PCTUSED 320
10.2.6 LOGGING和NOLOGGING 323
10.2.7 INITRANS和MAXTRANS 324
10.3 堆組織表 324
10.4 索引組織表 327
10.5 索引聚簇表 340
10.6 散列聚簇表 347
10.7 有序散列聚簇表 355
10.8 嵌套表 357
10.8.1 嵌套表語法 358
10.8.2 嵌套表存儲 364
10.8.3 嵌套表小結 367
10.9 臨時表 368
10.10 對象表 374
10.11 小結 380
第11章 索引 382
11.1 Oracle索引概述 382
11.2 B*樹索引 384
11.2.1 索引鍵壓縮 386
11.2.2 反向鍵索引 389
11.2.3 降序索引 394
11.2.4 什麼情況下應該使用B*樹索引 396
11.2.5B*樹小結 405
11.3 點陣圖索引 406
11.3.1 什麼情況下應該使用點陣圖索引 407
11.3.2 點陣圖聯結索引 410
11.3.3 點陣圖索引小結 413
11.4 基於函式的索引 413
11.4.1 重要的實現細節 413
11.4.2 一個簡單的基於函式的索引例子 414
11.4.3 只對部分行建立索引 422
11.4.4 實現有選擇的唯一性 424
11.4.5 關於ORA-01743的警告 424
11.4.6 基於函式的索引小結 425
11.5 套用域索引 425
11.6 關於索引的常見問題和神話 426
11.6.1 視圖能使用索引嗎 427
11.6.2 Null和索引能協作嗎 427
11.6.3 外鍵是否應該加索引 429
11.6.4 為什麼沒有使用我的索引 430
11.6.5 神話:索引中從不重用空間 435
11.6.6 神話:最有差別的元素應該在最前面 438
11.7 小結 441
第12章 數據類型 442
12.1 Oracle數據類型概述 442
12.2 字元和二進制串類型 444
12.2.1 NLS概述 445
12.2.2 字元串 448
12.3 二進制串:RAW類型 453
12.4 數值類型 455
12.4.1 NUMBER類型的語法和用法 457
12.4.2 BINARY_FLOAT/BINARY_DOUBLE類型的語法和用法 460
12.4.3 非固有數值類型 461
12.4.4 性能考慮 461
12.5 LONG類型 463
12.5.1 LONG和LONG RAW類型的限制 463
12.5.2 處理遺留的LONG類型 464
12.6 DATE、TIMESTAMP和INTERVAL類型 469
12.6.1 格式 469
12.6.2 DATE類型 470
12.6.3 TIMESTAMP類型 475
12.6.4 INTERVAL類型 482
12.7 LOB 類型 484
12.7.1 內部LOB 485
12.7.2 BFILE 495
12.8 ROWID/UROWID類型 497
12.9 小結 497
第13章 分區 499
13.1 分區概述 499
13.1.1 提高可用性 500
13.1.2 減少管理負擔 502
13.1.3 改善語句性能 505
13.2 表分區機制 507
13.2.1 區間分區 508
13.2.2 散列分區 510
13.2.3 列表分區 513
13.2.4 間隔分區 515
13.2.5 引用分區 520
13.2.6 組合分區 524
13.2.7 行移動 526
13.2.8 表分區機制小結 528
13.3 索引分區 529
13.3.1 局部索引與全局索引 530
13.3.2 局部索引 530
13.3.3 全局索引 535
13.4 再論分區和性能 547
13.5 審計和段空間壓縮 552
13.6 小結 553
第14章 並行執行 555
14.1 何時使用並行執行 556
14.2 Oracle Exadata 558
14.3 並行查詢 558
14.4 並行DML 564
14.5 並行DDL 566
14.5.1 並行DDL和使用外部表的數據載入 567
14.5.2 並行DDL和區段截斷 568
14.6 並行恢復 576
14.7 過程並行化 577
14.7.1 並行管道函式 578
14.7.2 DIY並行化 580
14.7.3 老式DIY並行化 583
14.8 小結 587
第15章 數據載入和卸載 588
15.1 SQLLDR 588
15.1.1 用SQLLDR載入數據的常見問題 592
15.1.2 SQLLDR警告 613
15.1.3 SQLLDR小結 614
15.2 外部表 614
15.2.1 建立外部表 615
15.2.2 處理錯誤 619
15.2.3 使用外部表載入不同的檔案 622
15.2.4 多用戶問題 623
15.2.5 外部表小結 624
15.3 平面檔案卸載 624
15.4 數據泵卸載 631
15.5 小結 633
第16章 數據加密 634
16.1 加密類型 634
16.1.1 動態數據 634
16.1.2 靜態數據 635
16.1.3 手動套用加密 638
16.1.4 Oracle錢夾 639
16.1.5 透明列級加密 641
16.1.6 透明表空間加密 644
16.2 加密不是訪問控制 646
16.3 實現手動套用加密 647
16.3.1 避免使用手動方法的原因 648
16.3.2 手動方法的性能影響 648
16.3.3 何時使用手動方法 652
16.4 實現列級加密 652
16.4.1 如何使用列級加密 653
16.4.2 列級加密的數據存儲 653
16.4.3 測量列級加密的性能影響 657
16.4.4 影響大小 657
16.4.5 列級加密的限制 662
16.5 實現表空間加密 663
16.5.1 如何使用表空間加密 663
16.5.2 表空間加密的數據存儲 664
16.5.3 測量表空間加密的性能影響 665
16.6 決定採用哪種加密技術 670
16.7 小結 671
索引 672