《循序漸進DB2——DBA系統管理、運維與套用案例》是清華大學出版社出版的圖書,作者是牛新莊。
基本介紹
- 書名:循序漸進DB2——DBA系統管理、運維與套用案例
- 作者:牛新莊
- ISBN:9787302201380
- 定價:80元
- 出版社:清華大學出版社
- 出版時間:2010-9-2
- 裝幀:平裝
圖書簡介,前言,目錄,
圖書簡介
本書側重於介紹DB2資料庫的性能調優。性能調優是一個系統工程:全面監控分析作業系統、I/O性能、記憶體、套用及資料庫才能快速找到問題根源;深刻理解DB2的鎖及並發機制、索引原理、資料庫參數、最佳化器原理、SQL語句調優等內部機理才能有針對性地快速提出解決問題的方法;快照、db2pd、db2expln及事件監控器等則是必須熟練掌握的工具。
本書系統性地總結了DB2資料庫性能調整的方法、流程、思路和保持系統良好性能的注意要點。最難得的是作者分享了10年積累的DB2性能調優案例和經驗總結。
本書系統性地總結了DB2資料庫性能調整的方法、流程、思路和保持系統良好性能的注意要點。最難得的是作者分享了10年積累的DB2性能調優案例和經驗總結。
前言
在介紹本書前,我先講講我的資料庫學習之路。我在1999年剛剛開始念碩士時就給自己確定了以後的發展方向,當時定了兩個:網路和資料庫技術。因為2000年時,網路特別紅火,擁有CCNP、CCIE認證的特別牛。所以自己也考了CCNP證書,但是到後來我發現網路有很多是硬體層面的東西,對廠商的依賴特彆強,而且面特別窄。所以慢慢地就把這個方向放棄了,而我喜歡鑽研,就選擇了資料庫技術。在確認好資料庫這個方向後,我深入地學習了資料庫理論方面的知識,我記得中國人民大學王珊教授那本《資料庫系統原理教程》一書我讀了幾十遍。在對資料庫理論學習的同時,我也開始對DB2和Oracle進行深入學習。
我是從1999年開始使用DB2 V5.2的,那時因為我導師做一個課題需要用到DB2資料庫。那時市場上關於DB2方面的技術書籍幾乎沒有,網際網路還不像現在這么發達,自己只能依靠查看DB2隨機文檔來學習。那時,我利用自己兼職幫別人做一些小軟體和課題的費用去考OCP認證和DB2認證。其實我認為考認證是一個很好的外界動力來促使自己學習,因為考試需要花費很大一筆費用,如果不想浪費錢就只能拚命地看書。這是一個很大的促使自己看書的外界動力。那時讀研究生有的是時間,所以在2000年我就把OCP 8i的認證通過了,後來又陸續通過了DB2 V5.2的認證。這些認證通過後能很大地增強自己的自信。當時我同時幫導師做應用程式開發工作,那時用PB、Delphi等編程工具。在開發中我有意識地增強自己對SQL的學習,這對我後來的性能調優非常有幫助。因為我很多時候在客戶現場看到同樣一個操作,本來在資料庫中利用函式或者其他高級SQL可以實現的,而開發人員卻頻繁地在資料庫和應用程式之間進行切換,殊不知,在過程層(程式)和資料庫層反覆上下文切換互動會顯著影回響用效率。我認為自己應該是國內寫SQL水平比較高的人,呵呵。所以,首先要有一個清晰的方向和規劃,然後有意識地去往這個方向努力。做好一個時期的人生規劃非常重要,它是你努力的方向,因為積極的學習比被動的學習效率要高太多。
機遇偏愛於有準備的人。記得2001年初的時候我在網上看到一個帖子說要找一個人去安裝DB2資料庫,差旅報銷,每天500元。那時我就喜出望外,因為需要有DB2認證才能去,而我那時DB2系統管理、套用開發的認證都有,所以很快就通過了。後來就去了客戶現場,到了以後才發現不是安裝,而是去給客戶講課,當時我就傻眼了,因為講課需要的遠比安裝配置要難得多,而之前我沒有講過課。沒辦法了,只能前一天夜裡看教材備課到凌晨5點,睡兩個小時,8點半去講課,就這樣4天講課,我每天都是休息3小時左右。還好自己畢竟使用過DB2,而且也過了DB2認證,還是有基礎的。這次講課雖然不太成功,但是畢竟通過了,勉強可以打60分吧,沒想到這次培訓竟是我以後幾年培訓生涯的開始。經過這次講課後,我也看到了自己的差距,知道僅僅擁有認證是不行的,因為客戶問的很多問題,書本上是沒有的,說明自己還需要進一步努力,而且自己看書有些概念雖然不太懂也不會太深入研究,但是如果講課你就自己必須把一些原理概念弄清楚,所以這需要對資料庫有更深入的學習。
後來經過一些其他的渠道,IBM培訓部知道我能講DB2並且有相關證書,就找我講DB2系列課程。所以從2001年開始,我就經常作為IBM官方講師開始講DB2系列所有課程。我感覺到講課是個很好的學習過程,因為講一些內容,你首先自己要搞清楚,這對提升自己有很大的幫助,我把課堂學員問的實際產生的問題自己深入地研究。我自己對培訓有這樣的認識,我是希望學員在這裡聽你講3個小時要遠遠勝過自己看3個小時,而且如果把講一堂課的內容比喻一杯水,那么老師至少應該儲備一桶水,才能駕馭。所以,我在講課準備過程中,精心準備實驗,深入和學員交流。爭取把一些概念能夠用淺顯易懂的例子來講解,而要想做到這些,首先自己必須對這個概念有深刻的理解。所以這在客觀上促進了自己的學習。
隨著培訓的增多,也有一些客戶找我去做一些實際的調優工作。我記得第一次去客戶現場調優是2001年去大連大通證券,當時主要解決鎖等待問題。客戶環境用到了AIX和CICS環境。當時雖然問題解決了,但自己心中還是感覺到比較虛,因為對AIX和CICS不了解,萬一如果是這兩個方面有問題,自己就沒辦法搞定了;同時認識到一個複雜系統的調整往往不是單方面的,需要具備全面的知識。經過這次事情後,我就在網上買了一個140的IBM工作站小機,自己安裝AIX,開始學習AIX。這個期間我一邊學習,一邊把AIX的認證全部過掉。我記得非常清楚,為了做HA的實驗著實費了很大的功夫,因為無法搞到7133陣列,那時小型機不像今天這么普及。後來自己又學習了CICS、WebSphere、MQ和存儲,所以我認為有目的的學習,有壓力和動力的學習效率是非常高的。就這樣,在我培訓的過程中,我發現自己哪個方面薄弱並且這個方向有前途,我就開始學習,不過那個時候我的技術主要以IBM為主。由於自己對培訓比較用心以及客戶的好評,開始找我做培訓的國內培訓機構開始變多,也感覺到這個期間自己的技術水平增長很快。
2002年11月,我參加首屆“IBM DeveloperWorksLive! China 2002”大會,並獲得IBM首次在國內評選的“傑出軟體技術專家”獎,在6名獲獎者中名列第2。獲得這個認證後對我有很大的幫助,因為找我的人更多了,所以2002、2003年是我技術提升最快的兩年,在這兩年我又陸續學習了HP-UX、WebSphere和MQ並通過了認證。其實我有時感覺到如果你把一門技術研究得非常深非常透,這時你再去學習另一門技術,就非常輕鬆,因為技術是觸類旁通的。我在學習完AIX再去學習HP-UX就感覺非常輕鬆。同時,在學習Oracle和DB2後再去學習Informix感覺到很容易。通過這種縱向的深入和橫向的比較,就會思考它們的區別,就能夠發現每一個產品的尺之所長、寸之所短,這樣技術視野更加全局。在學習過程中,不斷地把實踐和理論結合,不斷地補充理論來充實自己,知其然知其所以然。而且通過對一個產品的深入,往往能夠發現這個產品的缺點和需要改進的地方。就拿DB2來說,它的每次版本更新的新特性我基本上在新版本沒有出來之前就猜得差不多了。因為一是我是貼近真實用戶的,了解他們的真實需求;二是自己一直在用,自己不斷地總結思考;三是別的資料庫有,而DB2沒有,那么在下個版本就會增加。所以相對來說,對新版本的新特性學習就非常輕鬆了。
就DB2而言,我是國內擁有DB2認證最多的人,我擁有DB2 V5.2 、V7.1、V8.1和V9的全部認證。我是國內第一個把DB2 V8認證全部通過的人,當然這也是巧合,因為2003年3月非典我被困在深圳,在網上看到DB2 V8認證從4月1日開始考,就在前一天報名註冊,第二天把DB2 V8(新特性、高級DBA、套用開發、BI等所有認證)全部pass。
2004~2005年基本上是我最忙碌的兩年。那個時候找我講課的培訓機構以及性能調優的客戶非常多,一年我基本上天天在天上飛(當然學校導師那邊我是有辦法搞定的),培訓機構找我講課常常需要提前一個月預約時間。那時除了過年在家幾天,其他時間都是在做培訓和診斷調優等,足跡踏遍國內主要城市。那時我基本上是國內六大行開發中心和數據中心培訓的指定老師,只要時間不衝突,還為北京銀信科技、山東農信、廣東農信、交行大集中IBP等項目做資料庫技術顧問。那時年輕很有精力,我記得有一次是2004年9月,我白天上午9點為上海移動IT部門做AIX動態邏輯分區(DLPAR)的培訓;17點打車前往揚州,20點到達揚州供電局協助他們進行電力負荷控制系統項目上線,徹夜奮戰到凌晨3點半;然後連夜打的趕往上海,凌晨6點到達酒店;休息兩小時,8點出發,準時出現在上海移動培訓現場。那時我對報酬不太在意,我想的是拚命積累技術和客戶資源,不斷對技術學習、鑽研、思考、提高,以及不斷向上成長和孜孜不倦的探索,我就是這樣在不斷的學習、積累以及實踐中成長起來的。
在很長一段時間內,我不斷奔波於國內的各個城市,不計較出差、報酬,在我看來能夠不斷通過實踐讓自己成長是第一要義。而且去的客戶現場越多、處理的問題越多,就越發現自己的不足,然後就拚命地學習,不斷地積累、總結和思考,這樣就進入了一個良性循環。至今我仍然懷念那種充實、緊張和激情的黃金年代。2004年和2005年,我分別在上海、北京註冊了公司。一方面因為以獨立諮詢顧問的個人身份無法出具發票;另一方面,隨著項目越做越大,尤其是很多銀行的資料庫架構和維護項目涉及契約金額也越來越大,需要簽訂契約,以公司的身份來簽契約更加合適。當然這些年並非所有都是一帆風順,也犯過一些重大錯誤。例如,我曾經在2002年5月1日把某機場的資料庫調死,導致機場航班信息管理系統癱瘓;早期也曾經把證券系統因為調整而宕機。這些都對客戶造成了重大影響,同時也讓我思考總結自己的不足。也許這是成長必須要走的路。所以,經過這兩次事件之後,我之後的調優基本上沒有犯過錯誤。
2006年8月我獲得“2006年中國首屆傑出資料庫工程師”稱號,也算是對我這么多年學習資料庫的一個總結吧。2007年開始,我專注於做一些大客戶的運維,相應就減少了培訓的次數。2008年我被建設銀行以217萬年薪聘請為資深技術專家來維護Oracle和Informix資料庫。做技術而言,以一己之力能掙到年薪百萬這常常是我感到自豪的地方,也是讓我感覺到技術的魅力和自己這么多年對技術鑽研的認可。
致學友
其實我講我的技術之路,主要給大家一些參考,尤其對在校學生,我希望我的學習之路大家能夠模仿(畢竟大師級的路是很難模仿的)。而且,這么多年,能取得這么一點小成績,勤奮、努力和堅持一直是我看重的。因為有了這些,不至於機遇惠顧你時,你悵然若失。
在現在的很多年輕人身上,我以為恰恰缺少的就是這樣的忘我與痴迷。在我熟悉的資料庫技術領域,很多年輕人越來越早地將注意力集中在薪水和職位上,開始變得浮躁,而我想說的是,往往是那些將諸如高薪與職位忘懷的人反而能更快地提升。不經一番寒徹骨,安得梅花撲鼻香。這樣的道理人人都懂,可是能夠真正實施的人並不多。
所以,結合我的學習經驗與感悟,有16個字送給進入這一領域的讀者:去除浮躁,認真學習,不斷積累,尋找機遇。
這些年我做資料庫,相對於Oracle資料庫而言,我深深感到DB2技術書籍的匱乏,所以我一直想寫一套DB2方面的技術書籍。坦白地說,寫書是我掙錢性價比最低的一種方式,但是我一直感覺到自己有義務和責任去寫一些東西來給大家分享,也算是對自己10年DB2學習經驗的一個總結吧!但是過去一直沒有時間,直到今年奧運保障期間,有了一些時間,我才寫了這套書。在這套書中,我把套用開發和系統管理剝離開,分成兩條線來講解:《DB2套用開發實戰指導》、《循序漸進DB2》、《深入解析DB2》,《DB2資料庫性能調整與最佳化》。其實關於DB2方面的技術還有很多我沒有涉及,例如高可用性、資料庫分區、HDAR、高級安全等,但是限於篇幅和時間,我無法做到全方位的解析。
關於本書
本書側重在資料庫的性能調優。而性能調優是一個系統工程:全面監控分析作業系統、I/O性能、記憶體、套用及資料庫才能快速找到問題根源;深刻理解DB2的鎖及並發機制、索引原理、資料庫參數、最佳化器原理、SQL語句調優等內部機理才能有針對性地快速提出解決問題的方法;快照、db2pd、db2expln及事件監控器等等則是必須要熟練掌握的工具。本書正是覆蓋了性能調優所需要的全部領域,並提供了大量的性能調優的實際案例。
本書系統性地總結了DB2資料庫的性能調整的方法、流程、思路和保持系統良好性能的注意要點。最後,與讀者分享了我10年積累的DB2性能調優案例和經驗總結。本書所講內容適用於DB2 V7、V8和V9.5的所有平台。
資料庫學習之路
這裡我對資料庫學習做個總結:目前市場上雖然有Oracle、DB2、Informix、Sybase和SQL Server資料庫,但是Informix資料庫已經被IBM收購,而Sybase資料庫在技術和市場上正走向沒落。那么剩下的其實就是Oracle、DB2和SQL Server資料庫。SQL Server資料庫非常好,但是很遺憾的是只能在Windows平台使用,所以如果你深入研究SQL Server資料庫我只能說你可以養家餬口,但掙大錢的機率小,因為用SQL Sever資料庫的企業通常錢不多的,呵呵。而國內做Oracle資料庫的人太多了,如果你想在Oracle領域出人頭地,難度極大。反而DB2資料庫做的人不太多,物以稀為貴。DB2資料庫廣泛套用在銀行、電信、製造、零售、保險等行業,所以我強烈建議你學習DB2資料庫,鑽研IBM技術一般相對來說掙大錢的機率會大些。我們的時間精力是有限的,所以必須選擇好方向然後努力為之。
古之成大事者,不唯有超世之才,亦唯有堅忍不拔之志也!最後用這句話與大家共勉。
致謝
本書在出版的過程中得到了清華大學出版社王軍編輯的大力支持!這套DB2書籍從選題、審稿到出版無不得到他的熱心幫助,在此致以深深的謝意!感謝我的好兄弟駱洪青和袁春光,他們審核了書中的大部分章節。同時也感謝中信銀行的胡瑞娟、蘇蘭芳和我的師弟林春,他們審核了部分章節並從用戶的角度給我提出了很多寶貴的建議!最後,謹以此書獻給我心愛的妻子,遇到她是我人生最大的成就!
新莊
於2009年新年
DB2資料庫性能調整和最佳化
目錄
第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
第2章 存儲I/O設計19
2.1 存儲基本概念20
2.1.1 硬碟20
2.1.2 磁碟陣列技術21
2.1.3 存儲的Cache22
2.1.4 IOPS22
2.1.5 網路存儲技術23
2.2 存儲架構24
2.2.1 存儲I/O處理過程24
2.2.2 套用系統I/O流動圖24
2.2.3 RAID IOPS26
2.2.4 RAID 10和RAID 5的比較28
2.3 存儲相關性能調整案例31
2.4 存儲I/O設計總結32
第3章 作業系統相關性能問題35
3.1 HP-UX系統性能監控綜述35
3.1.1 監控資源對象和標準35
3.1.2 監控工具36
3.1.3 監控系統總體運行狀態36
3.1.4 性能狀態的判定流程和監控命令38
3.2 AIX性能監控綜述47
3.2.1 監控工具47
3.2.2 監控系統總體運行狀態48
3.2.3 監控CPU性能51
3.2.4 監控記憶體使用55
3.2.5 監控存儲系統狀態57
3.2.6 監控網路狀態58
3.3 作業系統性能最佳化60
3.3.1 直接I/O和並發I/O61
3.3.2 異步I/O和同步I/O62
3.3.3 minpout和maxpout65
3.3.4 檔案系統和裸設備65
3.3.5 負載均衡及條帶化(Striping)66
3.4 邏輯卷和lvmo最佳化72
3.4.1 使用lvmo進行最佳化73
3.4.2 卷組 pbuf 池73
3.4.3 pbuf設定不合理導致性能問題調整案例74
3.4.4 使用 ioo 進行最佳化78
3.5 總結83
第4章 資料庫物理設計和邏輯設計85
4.1 資料庫物理設計85
4.1.1 表空間容器放置原則85
4.1.2 資料庫物理設計原則86
4.2 資料庫邏輯設計86
4.2.1 緩衝池設計原則86
4.2.2 表空間設計原則91
4.3 使用Autoconfig設計資料庫99
4.4 其他高級設計技術102
4.4.1 表分區及套用案例102
4.4.2 資料庫分區及套用案例104
4.4.3 多維群集(MDC)及套用案例106
4.4.4 物化查詢表及套用案例110
4.4.5 MDC、資料庫分區、MQT和表分區配合使用114
4.4.6 表壓縮及套用案例125
4.4.7 表壓縮套用案例二132
4.4.8 XML及套用案例140
4.5 資料庫設計總結142
4.5.1 表空間與表設計方面的考慮142
4.5.2 索引設計方面的考慮146
4.5.3 緩衝池方面的考慮147
4.5.4 總結148
第5章 DB2性能監控149
5.1 快照監視器案例149
5.1.1 監控動態SQL語句149
5.1.2 監控臨時表空間使用152
5.2 事件監視器及監控案例153
5.3 利用表函式監控158
5.4 性能管理視圖及案例163
5.4.1 監控緩衝池命中率165
5.4.2 監控Package Cache大小165
5.4.3 監控執行成本最高的SQL語句166
5.4.4 監控運行最長的SQL語句166
5.4.5 監控SQL準備和預編譯時間最長的SQL語句167
5.4.6 監控執行次數最多的SQL語句167
5.4.7 監控排序次數最多的SQL語句168
5.4.8 監控LOCK WAIT等待時間168
5.4.9 監控LOCK CHAIN169
5.4.10 監控鎖記憶體使用170
5.4.11 監控鎖升級、死鎖和鎖逾時170
5.4.12 監控全表掃描的SQL171
5.4.13 檢查page cleaners是否足夠171
5.4.14 監控prefecher是否足夠172
5.4.15 監控資料庫記憶體使用173
5.4.16 監控日誌使用情況173
5.4.17 監控占用日誌空間最舊的交易174
5.4.18 用SQL監控健康指示器174
5.4.19 監控存儲路徑175
5.4.20 追蹤監控歷史176
5.5 db2pd176
5.5.1 常用db2pd監控選項和示例177
5.5.2 使用db2pd監控死鎖案例191
5.5.3 db2pd使用問題總結196
5.6 db2mtrk及監控案例197
5.7 本章小結200
第6章 資料庫配置參數調整201
6.1 資料庫配置參數201
6.2 監控和調優實例(DBM)配置參數203
6.2.1 代理程式相關配置參數203
6.2.2 SHEAPTHRES206
6.2.3 FCM_NUM_BUFFERS206
6.2.4 SHEAPTHRES_SHR207
6.2.5 INTRA_PARALLEL208
6.2.6 MON_HEAP_SZ208
6.2.7 QUERY_HEAP_SZ208
6.3 監控和調優DB配置參數208
6.3.1 緩衝池大小209
6.3.2 日誌緩衝區大小(LOGBUFSZ)215
6.3.3 應用程式堆大小(APPHEAPSZ)216
6.3.4 SORTHEAP和SHEAPTHRES217
6.3.5 鎖相關配置參數219
6.3.6 活動應用程式的最大數目(MAXAPPLS)223
6.3.7 PKGCACHESZ224
6.3.8 CATALOGCACHE_SZ224
6.3.9 異步頁清除程式的數目(NUM_IOCLEANERS)224
6.3.10 異步I/O 伺服器的數目(NUM_IOSERVERS)226
6.3.11 組提交數目(MINCOMMIT)226
6.3.12 AVG_APPLS228
6.3.13 CHNGPGS_THRESH(DB)228
6.3.14 MAXFILOP229
6.3.15 LOGPRIMARY、LOGSECOND和LOGFILSZ229
6.3.16 STMTHEAP229
6.3.17 DFT_QUERYOPT229
6.3.18 UTIL_HEAP_SZ (DB)230
6.4 調整DB2概要註冊變數230
6.4.1 DB2_PARALLEL_IO230
6.4.2 DB2_EVALUNCOMMITTED232
6.4.3 DB2_SKIPDELETED232
6.4.4 DB2_SKIPINSERTED232
6.4.5 DB2_USE_PAGE_CONTAINER_TAG233
6.4.6 DB2_SELECTIVITY233
6.5 記憶體自動調優233
6.5.1 記憶體自動調優示例234
6.5.2 啟用記憶體自動調優及相關參數235
6.6 總結237
第7章 鎖和並發239
7.1 鎖等待及調整案例239
7.1.1 鎖等待問題解決流程和步驟240
7.1.2 捕獲引起鎖等待的SQL242
7.1.3 利用db2pd捕獲鎖逾時244
7.2 鎖升級及調整案例248
7.2.1 監控鎖升級249
7.2.2 鎖升級調整250
7.3 死鎖及調整案例252
7.3.1 利用事件監視器監控死鎖253
7.3.2 死鎖案例255
7.3.3 最小化死鎖建議257
7.4 隔離級別與鎖257
7.4.1 可重複讀(RR—Repeatable Read)258
7.4.2 讀穩定性(RS—Read Stability)259
7.4.3 游標穩定性(CS—Cursor Stability)261
7.4.4 未提交讀(UR—Uncommitted Read)263
7.4.5 隔離級別加鎖總結265
7.4.6 隔離級別總結269
7.5 最大化並發性271
7.5.1 選擇合適的隔離級別271
7.5.2 儘量避免鎖等待、鎖升級和死鎖271
7.5.3 設定合理的註冊變數271
7.6 鎖相關的性能問題總結280
7.7 鎖與應用程式開發282
7.8 本章小結285
第8章 索引設計與最佳化287
8.1 索引概念287
8.1.1 索引優點287
8.1.2 索引類型289
8.2 索引結構290
8.3 理解索引訪問機制293
8.4 索引設計296
8.4.1 創建索引296
8.4.2 創建集群索引297
8.4.3 創建雙向索引297
8.4.4 完全索引訪問(index access only)299
8.4.5 與創建索引相關的問題299
8.4.6 創建索引示例300
8.5 索引創建原則與示例301
8.5.1 索引與謂詞301
8.5.2 根據查詢所使用的列建立索引303
8.5.3 根據條件語句中謂詞的選擇度創建索引304
8.5.4 避免在建有索引的列上使用函式305
8.5.5 在那些需要被排序的列上創建索引306
8.5.6 合理使用INCLUDE關鍵字創建索引307
8.5.7 指定索引的排序屬性308
8.6 影響索引性能的相關配置309
8.6.1 設定影響索引性能的配置參數309
8.6.2 為索引指定不同的表空間309
8.6.3 確保索引的集群度310
8.6.4 使表和索引統計信息保持最新310
8.6.5 重組索引311
8.7 索引維護311
8.7.1 異步索引清除(AIC)312
8.7.2 在線上索引整理碎片314
8.8 DB2 Design Advisor(db2advis)315
8.9 索引調整總結319
8.9.1 索引設計總結319
8.9.2 索引性能總結321
第9章 DB2最佳化器325
9.1 DB2最佳化器介紹326
9.2 SQL語句執行過程328
9.3 最佳化器組件和工作原理331
9.3.1 查詢重寫方法和示例:謂詞移動、合併和轉換331
9.3.2 查詢重寫示例:視圖合併332
9.3.3 查詢器重寫示例:消除DISTINCT335
9.3.4 查詢器重寫示例:隱含謂詞336
9.4 掃描方式337
9.4.1 全表掃描337
9.4.2 索引掃描338
9.5 連線方法341
9.5.1 嵌套循環連線343
9.5.2 合併連線344
9.5.3 哈希(hash)連線345
9.5.4 選擇最佳連線的策略346
9.6 最佳化級別347
9.7 如何影響最佳化器來提高性能348
9.7.1 使DB2統計信息保持最新348
9.7.2 構建適當的索引349
9.7.3 配置合理的資料庫配置參數350
9.7.4 選擇合適的最佳化級別351
9.7.5 合理的存儲I/O設計351
9.7.6 良好的應用程式設計和編碼352
9.8 最佳化器總結352
第10章 統計信息更新與碎片整理353
10.1 統計信息更新353
10.1.1 統計信息的重要性353
10.1.2 統計信息更新示例357
10.1.3 LIKE STATISTICS統計信息更新360
10.1.4 列組統計信息更新361
10.1.5 分布統計信息更新371
10.1.6 統計信息更新策略377
10.2 碎片整理379
10.2.1 碎片產生機制和影響379
10.2.2 確定何時重組表和索引380
10.2.3 執行表、索引檢查是否需要做REORG383
10.3 重新綁定程式包385
10.4 本章小結386
第11章 SQL語句調優389
11.1 通過監控找出最消耗資源的SQL語句389
11.2 通過解釋工具分析SQL語句執行計畫390
11.2.1 解釋表391
11.2.2 Visual Explain(可視化解釋)392
11.2.3 db2expln400
11.2.4 db2exfmt403
11.2.5 各種解釋工具比較405
11.2.6 如何從解釋信息中獲取有價值的建議406
11.3 理解SQL語句如何工作406
11.3.1 理解謂詞類型406
11.3.2 排序和分組410
11.3.3 連線方法412
11.3.4 掃描方式413
11.4 SQL調優案例413
11.4.1 用一條語句即可做到時避免使用多條語句413
11.4.2 合理使用NOT IN和NOT EXISTS414
11.4.3 合理使用子查詢減少數據掃描和利用索引417
11.4.4 調整表的連線順序,減小中間結果集的數據量418
11.4.5 在有偏差數據的情況下使用參數標記時,指定選擇性420
11.4.6 SQL使用UDF代替查詢中複雜的部分420
11.4.7 從多個SQL語句到一個 SQL表達式422
11.4.8 使用SQL一次處理一個集合語義423
11.4.9 在無副作用的情況下,請使用SQL 函式425
11.4.10 小結426
11.5 提高應用程式性能426
11.5.1 良好的SQL編碼規則426
11.5.2 提高SQL編程性能428
11.5.3 改進游標性能430
11.5.4 根據業務邏輯選擇最低粒度的隔離級別431
11.5.5 通過REOPT綁定選項來提高性能431
11.5.6 統計信息、碎片整理和重新綁定432
11.5.7 避免不必要的排序433
11.5.8 在C/S環境中利用SQL存儲過程降低網路開銷433
11.5.9 高並發環境下使用連線池433
11.5.10 使用Design Advisor(db2advis)建議索引434
11.5.11 提高批量刪除、插入和更新速度434
第12章 DB2調優案例、問題總結和技巧437
12.1 調優案例一:某移動公司存儲設計不當和SQL引起的I/O瓶頸437
12.2 調優案例二:某銀行知識庫系統鎖等待、鎖升級引起性能瓶頸444
12.3 調優案例三:某汽車製造商ERP系統通過調整統計信息提高性能453
12.4 調優案例四:某農信社批量代收電費批處理慢調優案例464
12.5 調優學習案例:利用壓力測試程式學習DB2調優468
後 記501
參考文獻503
DB2資料庫性能調整和最佳化