內容簡介

本書提供了一種簡單、高效、通用的關系型數據庫索引設計方法。作者通過系統的講解及大量的案例清晰地闡釋了關系型數據庫的訪問路徑選擇原理,以及表和索引的掃描方式,詳盡地講解了如何快速地估算SQL運行的CPU時間及執行時間,幫助讀者從原理上理解SQL、表及索引結構、訪問方式等對關系型數據庫造成的影響,並能夠運用量化的方法進行判斷和優化,指導關系型數據庫的索引設計。

Tapio Lahdenmaki,數據庫性能顧問,教授通用索引設計課程。他在IBM公司工作了三十多年,是公司全球課程中有關DB2 (for z/OS)性能相關課程的主要作者。Michael Leach,關系型數據庫顧問,已從IBM公司退休,他擁有二十年的應用系統及數據庫課程的教授經驗。兩位作者的文章均被翻譯成了多國語言廣為傳播。他們有關索引設計的方法被成功應用於許多核心系統。
 

目錄

第1章 概述1
關於SQL性能的另一本書1
不合適的索引3
誤區和誤解4
誤區1:索引層級不要超過5層5
誤區2:單表的索引數不要超過6個6
誤區3:不應該索引不穩定的列6
示例7
磁盤驅動器使用率7
系統化的索引設計8

第2章 表和索引結構10
介紹10
索引頁和表頁11
索引行11
索引結構12
表行12
緩沖池和磁盤I/O12
從DBMS緩沖池進行的讀取13
從磁盤驅動器進行的隨機I/O13
從磁盤服務器緩存進行的讀取14
從磁盤驅動器進行的順序讀取15
輔助式隨機讀15
輔助式順序讀18
同步I/O和異步I/O18
硬件特性19
DBMS特性20
頁20
表聚簇21
索引行21
表行22
索引組織表22
頁鄰接23
B樹索引的替代品24
聚簇的許多含義25

第3章 SQL處理過程27
簡介27
謂詞27
評注28
優化器及訪問路徑28
索引片及匹配列29
索引過濾及過濾列29
訪問路徑術語31
監控優化器32
幫助優化器(統計信息)32
幫助優化器(FETCH調用的次數)32
何時確定訪問路徑33
過濾因子34
組合謂詞的過濾因子35
過濾因子對索引設計的影響37
物化結果集39
游標回顧39
方式1:一次FETCH調用物化一條記錄40
方式2:提前物化41
數據庫設計人員必須牢記41
練習41

第4章 為SELETE語句創建理想的索引43
簡介43
磁盤及CPU時間的基礎假設44
不合適的索引44
三星索引——查詢語句的理想索引45
星級是如何給定的46
范圍謂詞和三星索引48
為查詢語句設計最佳索引的算法49
候選A50
候選B50
現今排序速度很快——為什麼我們還需要候選B51
需要為所有查詢語句都設計理想索引嗎52
完全多余的索引52
近乎多余的索引53
可能多余的索引53
新增一個索引的代價54
響應時間54
磁盤負載55
磁盤空間56
一些建議57
練習58

第5章 前瞻性的索引設計59
發現不合適的索引59
基本問題法(BQ)59
注意60
快速上限估算法(QUBE)61
服務時間62
排隊時間62
基本概念:訪問63
計算訪問次數65
FETCH處理66
主要訪問路徑的QUBE示例67
使用滿足需求的成本最低的索引還是所能達到的最優索引:示例172
該事務的基本問題73
對該事務上限的快速估算73
使用滿足需求的成本最低的索引還是所能達到的最優索引74
該事務的最佳索引75
半寬索引(最大化索引過濾)75
寬索引(只需訪問索引)76
使用滿足需求的成本最低的索引還是所能達到的最優索引:示例277
范圍事務的BQ及QUBE78
該事務的最佳索引79
半寬索引(最大化索引過濾)80
寬索引(只需訪問索引)81
何時使用QUBE82

第6章 影響索引設計過程的因素83
I/O時間估算的驗證83
多個窄索引片84
簡單就是美(和安全)86
困難謂詞87
LIKE謂詞87
OR操作符和布爾謂詞88
IN謂詞89
過濾因子隱患90
過濾因子隱患的例子92
最佳索引95
半寬索引(最大化索引過濾)96
寬索引(只需訪問索引)97
總結97
練習99

第7章 被動式索引設計100
簡介100
EXPLAIN描述了所選擇的訪問路徑101
全表掃描或全索引掃描101
對結果集排序101
成本估算102
數據庫管理系統特定的EXPLAIN選項及限制102
監視揭示現實103
性能監視器的演進104
LRT級別的異常監視106
程序粒度的均值是不夠的106
異常報告舉例:每個尖刺一行106
問題制造者和受害者108
有優化空間的問題制造者和無優化空間的問題制造者108
有優化空間的問題制造者109
調優的潛在空間111
無優化空間的問題制造者114
受害者115
查找慢的SQL調用117
調用級別的異常監視118
Oracle舉例121
SQL Server舉例123
結論125
數據庫管理系統特定的監視問題126
尖刺報告127
練習127

第8章 為表連接設計索引129
簡介129
兩個簡單的表連接131
例8.1:CUST表作為外層表131
例8.2:INVOICE表作為外層表132
表訪問順序對索引設計的影響133
案例研究133
現有索引136
理想索引142
理想索引,每事務物化一屏結果集146
理想索引,每事務物化一屏結果集且遇到FF缺陷149
基本連接的問題(BJQ)151
結論:嵌套循環連接153
預測表的訪問順序153
合並掃描連接和哈希連接155
合並掃描連接155
例8.3:合並掃描連接155
哈希連接157
程序C:由優化器選擇MS/HJ(在現有索引條件下)158
理想索引159
嵌套循環連接VS.MS/HJ及理想索引161
嵌套循環連接VS.MS/HJ161
嵌套循環連接VS.理想索引162
連接兩張以上的表163
為什麼連接的性能表現較差166
模糊的索引設計166
優化器可能選擇錯誤的表訪問路徑166
樂觀的表設計166
為子查詢設計索引167
為UNION語句設計索引167
對於表設計的思考167
冗余數據167
無意識的表設計171
練習173

第9章 星型連接175
介紹175
維度表的索引設計177
表訪問順序的影響178
事實表的索引179
匯總表182

第10章 多索引訪問184
簡介184
索引與184
與查詢表一同使用索引與186
多索引訪問和事實數據表187
用位圖索引進行多索引訪問187
索引或188
索引連接189
練習190

第11章 索引和索引重組191
B樹索引的物理結構191
DBMS如何查找索引行192
插入一行時會發生什麼193
葉子頁的分裂嚴重嗎194
什麼時候應該對索引進行重組196
插入模式196
索引列的穩定性205
長索引行207
舉例:對順序敏感的批處理任務208
表亂序(存在聚簇索引)211
表亂序(沒有以CNO開頭的聚簇索引)212
存儲在葉子頁中的表行212
SQL Server212
Oracle213
索引重組的代價214
分裂的監控215
總結216

第12章 數據庫管理系統相關的索引限制219
簡介219
索引列的數量219
索引列的總長度220
變長列220
單表索引數量上限220
索引大小上限220
索引鎖定221
索引行壓縮221
數據庫管理系統索引創建舉例222

第13章 數據庫索引選項224
簡介224
索引行壓縮224
索引鍵以外的其他索引列225
唯一約束227
從不同的方向掃描數據庫索引227
索引鍵截斷228
基於函數的索引228
索引跳躍式掃描229
塊索引230
數據分區的二級索引230
練習231

第14章 優化器不是完美的232
簡介232
優化器並不總能看見最佳方案234
匹配及過濾問題234
非BT謂詞234
無法避免的排序237
不必要的表訪問238
優化器的成本估算可能錯得離譜239
使用綁定變量的范圍謂詞239
偏斜分布241
相關列242
部分索引鍵的警示故事243
成本估算公式246
估算I/O時間247
估算CPU時間248
協助優化器處理估算相關的問題249
優化器的問題是否會影響索引設計252
練習253

第15章 其他評估事項254
QUBE公式背后的假設條件254
內存中的非葉子索引頁255
例子255
磁盤服務器讀緩存的影響256
緩沖子池258
長記錄259
慢速順序讀259
實際的響應時間可能比QUBE評估值短得多259
葉子頁和表頁緩存在緩沖池中260
識別低成本的隨機訪問262
輔助式隨機讀取262
輔助式順序讀265
評估CPU時間(CQUBE)265
單次順序訪問的CPU時間265
單次隨機訪問的CPU時間267
單次FETCH調用的CPU時間269
每排序一行的平均CPU時間270
CPU評估舉例270
寬索引還是理想索引270
嵌套循環(及反范式化)還是MS/HJ271
合並掃描與哈希連接的比較274
跳躍式順序掃描275
CPU時間仍然不可忽視276

第16章 組織索引設計過程277
簡介277
計算機輔助式索引設計278
設計出色索引的9個步驟280
參考文獻282
術語表283
索引291
網路書店 類別 折扣 價格
  1. 新書
    $474