DB2資料庫性能調整和最佳化(第2版)

內容介紹

本書側重於介紹DB2資料庫的性能調優。性能調優是一個系統工程:全面監控分析作業系統、I/O性能、記憶體、套用及資料庫才能快速找到問題根源;深刻理解DB2的鎖及並發機制、索引原理、資料庫參數、最佳化器原理、SQL語句調優等內部機理才能針對性地快速提出解決問題的方法;快照、db2pd、db2expln及事件監控器等則是必須熟練掌握的工具。這本書覆蓋了進行DB2資料庫性能調優所需的全部知識和工具,並提供了大量的性能調優的實際案例。
本書系統性地總結了DB2資料庫性能調整的方法、流程、思路和保持系統良好性能的注意要點。最難得的是作者分享了其10年積累的DB2性能調優案例和經驗總結。

作者介紹

牛新莊,國內頂尖數據架構和信息治理專家,擔任對外經濟貿易大學客座教授、北京交通大學兼職教授、中國DB2用戶協會(CDUG)理事長、亞洲金融合作聯盟信息科技委員會主任。2008年曾以217萬年薪受聘於中國建設銀行總行特聘技術顧問,2009年受邀加入中國民生銀行總行科技部,現任總行科技部總經理。
牛新莊博士擁有20多項國際廠商認證(包括DB2 V5~V9的全部認證),獲得過國內資料庫領域最高榮譽的“2006年中國首屆傑出資料庫工程師獎”、“首屆IBM傑出軟體專家獎”、“2006年IT168技術卓越獎”等獎項。

作品目錄

第1章性能調整概述 1
1.1性能概述 2
1.2性能評估 4
1.3建立性能目標 7
1.4什麼時候需要做性能調整 8
1.5性能調整準則 9
1.6性能調整的方法和過程 10
1.6.1性能調整的步驟 10
1.6.2性能調整的限制 11
1.6.3向客戶了解情況 11
1.6.4性能調整流程圖 12
1.7性能模型 15
1.7.1輸入 17
1.7.2處理 17
1.7.3輸出 23
1.8本章小結 24
第2章作業系統及存儲的性能調優 27
2.1AIX性能監控綜述 29
2.1.1監控工具 29
2.1.2監控系統總體運行狀態 30
2.1.3監控CPU性能 34
2.1.4監控記憶體使用 38
2.1.5監控存儲系統狀態 40
2.1.6監控網路狀態 42
2.2作業系統性能最佳化 43
2.2.1直接I/O和並發I/O 44
2.2.2異步I/O和同步I/O 45
2.2.3minpout和maxpout 47
2.2.4檔案系統和裸設備 47
2.2.5負載均衡及條帶化
(Striping) 48
2.3邏輯卷和lvmo最佳化 53
2.3.1使用lvmo進行最佳化 54
2.3.2卷組pbuf池 55
2.3.3pbuf設定不合理導致性能
問題調整案例 56
2.3.4使用ioo進行最佳化 60
2.4作業系統性能調整總結 65
2.5存儲I/O設計 65
2.6存儲基本概念 65
2.6.1硬碟 65
2.6.2磁碟陣列技術 67
2.6.3存儲的Cache 67
2.6.4網路存儲技術 68
2.7存儲架構 69
2.7.1存儲I/O處理過程 69
2.7.2RAID IOPS 70
2.7.3RAID 10和RAID 5的
比較 71
2.8良好存儲規劃的目標 74
2.9良好存儲規劃的設計原則 75
2.10存儲相關性能調整案例 76
2.11存儲I/O性能調整總結 79
2.12本章小結 80
第3章DB2性能監控 81
3.1快照監視器案例 81
3.1.1監控動態SQL語句 81
3.1.2監控臨時表空間使用 84
3.2事件監視器及監控案例 87
3.3利用表函式監控 93
3.4性能管理視圖及案例 99
3.4.1監控緩衝池命中率 100
3.4.2監控Package Cache大小 101
3.4.3監控執行成本最高的SQL
語句 102
3.4.4監控運行時間最長的SQL
語句 102
3.4.5監控SQL準備和預編譯
時間最長的SQL語句 103
3.4.6監控執行次數最多的SQL
語句 103
3.4.7監控排序次數最多的SQL
語句 104
3.4.8監控鎖等待時間 104
3.4.9監控Lock Chain 105
3.4.10監控鎖記憶體的使用 108
3.4.11監控鎖升級、死鎖和
鎖逾時 108
3.4.12監控全表掃描的SQL 109
3.4.13檢查頁清理器是否足夠 110
3.4.14監控prefecher是否足夠 110
3.4.15監控資料庫記憶體使用 111
3.4.16監控日誌使用情況 112
3.4.17監控占用日誌空間最舊的
事務 112
3.4.18監控存儲路徑 113
3.4.19追蹤監控歷史 114
3.5db2pd 114
3.5.1常用db2pd監控選項和
示例 115
3.5.2使用db2pd監控死鎖
案例 127
3.5.3db2pd使用問題總結 132
3.6記憶體監控 134
3.6.1db2pd 記憶體監控 134
3.6.2db2mtrk 記憶體監控 138
3.7本章小結 140
第4章DB2配置參數調整 141
4.1初識DB2配置參數 141
4.2監控和調優實例級(DBM)
配置參數 143
4.2.1代理程式相關配置參數 143
4.2.2sheapthres 146
4.2.3fcm_num_buffers 146
4.2.4sheapthres_shr 147
4.2.5intra_parallel 147
4.2.6mon_heap_sz 148
4.2.7query_heap_sz 148
4.3監控和調優資料庫級配置
參數 148
4.3.1緩衝池大小 149
4.3.2日誌緩衝區大小(logbufsz) 155
4.3.3應用程式堆大小
(applheapsz) 156
4.3.4sortheap和sheapthres_shr 157
4.3.5鎖相關配置參數 159
4.3.6活動應用程式的最大數目
(maxappls) 163
4.3.7pckcachesz 163
4.3.8catalogcache_sz 164
4.3.9異步頁清除程式的數目
(num_iocleaners) 164
4.3.10異步I/O 伺服器的數目
(num_ioservers) 166
4.3.11組提交數目(mincommit) 166
4.3.12avg_appls 168
4.3.13chngpgs_thresh(DB) 168
4.3.14maxfilop 169
4.3.15logprimary、logsecond和
logfilsz 169
4.3.16stmtheap 170
4.3.17dft_queryopt 170
4.3.18util_heap_sz (DB) 170
4.4調整DB2概要註冊變數 170
4.4.1db2_parallel_io 171
4.4.2db2_evaluncommitted 173
4.4.3db2_skipdeleted 173
4.4.4db2_skipinserted 173
4.4.5db2_use_page_
container_tag 173
4.4.6db2_selectivity 173
4.4.7db2_logger_non_
buffered_io 174
4.5記憶體自動調優 174
4.5.1記憶體自動調優示例 175
4.5.2啟用記憶體自動調優及
相關參數 176
4.5.3記憶體配置參數的配置原則 178
4.6本章小結 179
第5章高級鎖與最佳化 181
5.1隔離級別與鎖 181
5.1.1可重複讀(RR—Repeatable
Read) 182
5.1.2讀穩定性(RS—Read
Stability) 184
5.1.3游標穩定性(CS—Cursor
Stability) 186
5.1.4當前提交
(Currently Committed) 188
5.1.5未提交讀
(UR—Uncommitted Read) 190
5.1.6隔離級別總結 193
5.2加鎖總結 195
5.2.1如何獲取鎖 195
5.2.2意圖鎖和非意圖鎖 196
5.2.3讀鎖和寫鎖 197
5.2.4LRB(Lock Resource Block) 197
5.2.5USE AND KEEP LOCKS 198
5.2.6索引類型和下一鍵鎖 199
5.2.7掃描方式與加鎖 201
5.3樂觀鎖 204
5.3.1悲觀鎖和樂觀鎖 204
5.3.2DB2 V9.5中的樂觀鎖 205
5.3.3樂觀鎖套用案例 212
5.4內部鎖 221
5.4.1內部方案鎖
(Internal Plan Lock) 221
5.4.2內部V鎖(Internal Variation
Lock) 222
5.4.3內部S鎖 223
5.4.4內部C鎖 224
5.4.5其他內部鎖 225
5.5鎖等待及調整案例 228
5.5.1鎖等待問題解決流程和
步驟 228
5.5.2捕獲引起鎖等待的SQL
語句 230
5.5.3利用db2pd捕獲鎖逾時 233
5.5.4利用事件監視器捕獲鎖
逾時 236
5.6鎖升級及調整案例 238
5.6.1監控鎖升級 239
5.6.2鎖升級調整 239
5.7死鎖及調整案例 241
5.7.1利用事件監視器監控死鎖 242
5.7.2死鎖案例 243
5.7.3最小化死鎖建議 246
5.8最大化並發性 246
5.8.1選擇合適的隔離級別 246
5.8.2儘量避免鎖等待、鎖升級和
死鎖 246
5.8.3設定合理的註冊表變數 247
5.9鎖相關的性能問題總結 255
5.10鎖與應用程式開發 256
5.11本章小結 259
第6章索引設計與最佳化 261
6.1索引概念 261
6.1.1索引優點 261
6.1.2索引類型 263
6.2索引結構 263
6.3理解索引訪問機制 266
6.4索引設計 269
6.4.1創建索引 269
6.4.2創建集群索引 270
6.4.3創建雙向索引 271
6.4.4完全索引訪問 272
6.4.5與創建索引相關的問題 273
6.4.6創建索引示例 273
6.5索引創建原則與示例 274
6.5.1索引與謂詞 274
6.5.2根據查詢使用的列建立
索引 276
6.5.3根據條件語句中謂詞的
選擇度創建索引 277
6.5.4避免在建有索引的列上使用
函式 278
6.5.5在那些需要被排序的列上
創建索引 278
6.5.6合理使用INCLUDE關鍵字
創建索引 280
6.5.7指定索引的排序屬性 281
6.6影響索引性能的相關配置 282
6.6.1設定影響索引性能的配置
參數 282
6.6.2為索引指定不同的表空間 282
6.6.3確保索引的集群度 283
6.6.4使表和索引統計信息保持
最新 283
6.6.5重組索引 283
6.7索引維護 284
6.7.1異步索引清除(AIC) 285
6.7.2在線上索引整理碎片 287
6.7.3查找使用率低下的索引 287
6.7.4索引壓縮 289
6.8DB2 Design Advisor
(db2advis) 289
6.9本章小結 293
第7章DB2最佳化器 299
7.1DB2最佳化器介紹 300
7.2SQL語句執行過程 302
7.3最佳化器組件和工作原理 304
7.3.1查詢重寫示例:謂詞移動、
合併和轉換 305
7.3.2最佳化器成本評估 310
7.3.3本地謂詞基數(cardinality)
估計 311
7.3.4連線基數(cardinality)估計 313
7.3.5分布統計信息 317
7.3.6列組統計信息對基數的
影響 321
7.4掃描方式 330
7.4.1全表掃描 331
7.4.2索引掃描 331
7.4.3RID SCAN 334
7.5連線方法 335
7.5.1嵌套循環連線 336
7.5.2合併連線 338
7.5.3哈希連線 339
7.5.4選擇最佳連線的策略 340
7.6最佳化級別 340
7.6.1最佳化級別概述 341
7.6.2選擇最佳化級別 344
7.6.3設定最佳化級別 345
7.7基於規則的最佳化 347
7.7.1最佳化器概要檔案概述 347
7.7.2啟用最佳化概要檔案 349
7.7.3最佳化概要檔案使用示例 350
7.8如何影響最佳化器來提高性能 357
7.8.1使DB2統計信息保持
最新 357
7.8.2構建適當的索引 357
7.8.3配置合理的資料庫配置
參數 358
7.8.4選擇合適的最佳化級別 359
7.8.5合理的存儲I/O設計 359
7.8.6良好的應用程式設計和
編碼 360
7.9本章小結 363
第8章統計信息更新與碎片整理 365
8.1統計信息更新 365
8.1.1統計信息的重要性 365
8.1.2統計信息更新示例 369
8.1.3LIKE STATISTICS統計
信息更新 372
8.1.4列組統計信息更新 374
8.1.5分布統計信息更新 383
8.1.6統計信息更新策略 389
8.2自動統計信息更新 391
8.2.1自動RUNSTATS的
基本概念 391
8.2.2如何打開auto runstats 393
8.2.3如何監控auto runstats 395
8.2.4DB2 V10新特性——自動
收集統計視圖的統計信息 396
8.3碎片整理 397
8.3.1碎片產生機制和影響 397
8.3.2確定何時重組表和索引 398
8.3.3執行表、索引檢查是否
需要做REORG 401
8.3.4REORG的用法和使用
策略 402
8.4重新綁定程式包 405
8.5本章小結 407
第9章SQL語句調優 409
9.1通過監控找出最消耗資源的
SQL語句 409
9.2通過解釋工具分析SQL語句
執行計畫 410
9.2.1解釋表 411
9.2.2Visual Explain
(可視化解釋) 412
9.2.3db2expln 419
9.2.4db2exfmt 422
9.2.5各種解釋工具的比較 424
9.2.6如何從解釋信息中獲取有
價值的建議 424
9.3理解SQL語句如何工作 425
9.3.1理解謂詞類型 425
9.3.2排序和分組 428
9.3.3連線方法 430
9.3.4掃描方式 431
9.4SQL調優案例 431
9.4.1儘量使用單條語句完成
邏輯 431
9.4.2合理使用NOT IN和NOT
EXISTS 432
9.4.3利用子查詢進行最佳化 434
9.4.4調整表連線順序使JOIN
最優 436
9.4.5數據非均勻分布時手工指定
選擇性 437
9.4.6使用UDF代替查詢中的
複雜部分 438
9.4.7合併多條SQL語句到單個
SQL表達式 439
9.4.8使用SQL一次處理一個集合
語義 440
9.4.9在無副作用的情況下使用
SQL函式 442
9.4.10小結 443
9.5提高應用程式性能 443
9.5.1良好的SQL編碼規則 443
9.5.2提高SQL編程性能 445
9.5.3改進游標性能 447
9.5.4根據業務邏輯選擇最低粒
度的隔離級別 448
9.5.5通過REOPT綁定選項來
提高性能 448
9.5.6統計信息、碎片整理和重新
綁定 449
9.5.7避免不必要的排序 449
9.5.8在C/S環境中利用SQL存儲
過程降低網路開銷 450
9.5.9在高並發環境下使用
連線池 450
9.5.10使用Design Advisor(db2advis)
建議索引 450
9.5.11提高批量刪除、插入和
更新速度 451
9.5.12提高插入性能 451
9.5.13高效的SELECT語句 452
9.6高性能SQL語句注意事項 453
9.6.1避免在搜尋條件中使用
複雜的表達式 453
9.6.2將 OPTIMIZE FOR n ROWS
子句與FETCH FIRST n
ROWS ONLY子句配合
使用 454
9.6.3避免使用冗餘的謂詞 454
9.6.4避免使用多個帶有DISTINCT
關鍵字的聚集操作 455
9.6.5避免連線列之間數據類型
不匹配 456
9.6.6避免對表達式使用連線
謂詞 456
9.6.7避免在謂詞中使用空操作表
達式來更改最佳化器估算 456
9.6.8確保查詢符合星型模式連線
的必需條件 457
9.6.9避免使用非等式連線謂詞 458
9.6.10避免使用不必要的
外連線 459
9.6.11使用參數標記來縮短動態
查詢的編譯時間 459
9.6.12使用約束來提高查詢最佳化
程度 460
9.7本章小結 461
第10章DB2調優案例、問題總結和
技巧 463
10.1調優案例1:某移動公司存儲
設計不當和SQL引起的I/O
瓶頸 463
10.2調優案例2:某銀行知識庫系統
鎖等待、鎖升級引起性能
瓶頸 470
10.3調優案例3:某汽車製造商ERP
系統通過調整統計信息提高
性能 478
10.4調優案例4:某農信社批量代收
電費批處理慢調優案例 488
10.5調優案例5:某銀行系統SQL
執行慢,通過跟蹤信息獲取
調整信息 492
10.6調優案例6:某銀行系統欄位
類型定義錯誤導致SQL執行
時間變長 495
10.7調優學習案例:利用壓力測試
程式學習DB2調優 498

相關詞條

熱門詞條

聯絡我們