出版時(shí)間:2009-5 出版社:清華大學(xué) 作者:牛新莊 頁數(shù):499
Tag標(biāo)簽:無
前言
前 言 在介紹本書前,我先講講我的數(shù)據(jù)庫學(xué)習(xí)之路。我在1999年剛剛開始念碩士時(shí)就給自己確定了以后的發(fā)展方向,當(dāng)時(shí)定了兩個(gè):網(wǎng)絡(luò)和數(shù)據(jù)庫技術(shù)。因?yàn)?000年時(shí),網(wǎng)絡(luò)特別紅火,擁有CCNP、CCIE認(rèn)證的特別牛。所以自己也考了CCNP證書,但是到后來我發(fā)現(xiàn)網(wǎng)絡(luò)有很多是硬件層面的東西,對廠商的依賴特別強(qiáng),而且面特別窄。所以慢慢地就把這個(gè)方向放棄了,而我喜歡鉆研,就選擇了數(shù)據(jù)庫技術(shù)。在確認(rèn)好數(shù)據(jù)庫這個(gè)方向后,我深入地學(xué)習(xí)了數(shù)據(jù)庫理論方面的知識,我記得中國人民大學(xué)王珊教授那本《數(shù)據(jù)庫系統(tǒng)原理教程》一書我讀了幾十遍。在對數(shù)據(jù)庫理論學(xué)習(xí)的同時(shí),我也開始對DB2和Oracle進(jìn)行深入學(xué)習(xí)?! ∥沂菑?999年開始使用DB2 V5.2的,那時(shí)因?yàn)槲覍?dǎo)師做一個(gè)課題需要用到DB2數(shù)據(jù)庫。那時(shí)市場上關(guān)于DB2方面的技術(shù)書籍幾乎沒有,互聯(lián)網(wǎng)還不像現(xiàn)在這么發(fā)達(dá),自己只能依靠查看DB2隨機(jī)文檔來學(xué)習(xí)。那時(shí),我利用自己兼職幫別人做一些小軟件和課題的費(fèi)用去考OCP認(rèn)證和DB2認(rèn)證。其實(shí)我認(rèn)為考認(rèn)證是一個(gè)很好的外界動(dòng)力來促使自己學(xué)習(xí),因?yàn)榭荚囆枰ㄙM(fèi)很大一筆費(fèi)用,如果不想浪費(fèi)錢就只能拼命地看書。這是一個(gè)很大的促使自己看書的外界動(dòng)力。那時(shí)讀研究生有的是時(shí)間,所以在2000年我就把OCP 8i的認(rèn)證通過了,后來又陸續(xù)通過了DB2 V5.2的認(rèn)證。這些認(rèn)證通過后能很大地增強(qiáng)自己的自信。當(dāng)時(shí)我同時(shí)幫導(dǎo)師做應(yīng)用程序開發(fā)工作,那時(shí)用PB、Delphi等編程工具。在開發(fā)中我有意識地增強(qiáng)自己對SQL的學(xué)習(xí),這對我后來的性能調(diào)優(yōu)非常有幫助。因?yàn)槲液芏鄷r(shí)候在客戶現(xiàn)場看到同樣一個(gè)操作,本來在數(shù)據(jù)庫中利用函數(shù)或者其他高級SQL可以實(shí)現(xiàn)的,而開發(fā)人員卻頻繁地在數(shù)據(jù)庫和應(yīng)用程序之間進(jìn)行切換,殊不知,在過程層(程序)和數(shù)據(jù)庫層反復(fù)上下文切換交互會顯著影響應(yīng)用效率。我認(rèn)為自己應(yīng)該是國內(nèi)寫SQL水平比較高的人,呵呵。所以,首先要有一個(gè)清晰的方向和規(guī)劃,然后有意識地去往這個(gè)方向努力。做好一個(gè)時(shí)期的人生規(guī)劃非常重要,它是你努力的方向,因?yàn)榉e極的學(xué)習(xí)比被動(dòng)的學(xué)習(xí)效率要高太多?! C(jī)遇偏愛于有準(zhǔn)備的人。記得2001年初的時(shí)候我在網(wǎng)上看到一個(gè)帖子說要找一個(gè)人去安裝DB2數(shù)據(jù)庫,差旅報(bào)銷,每天500元。那時(shí)我就喜出望外,因?yàn)樾枰蠨B2認(rèn)證才能去,而我那時(shí)DB2系統(tǒng)管理、應(yīng)用開發(fā)的認(rèn)證都有,所以很快就通過了。后來就去了客戶現(xiàn)場,到了以后才發(fā)現(xiàn)不是安裝,而是去給客戶講課,當(dāng)時(shí)我就傻眼了,因?yàn)橹v課需要的遠(yuǎn)比安裝配置要難得多,而之前我沒有講過課。沒辦法了,只能前一天夜里看教材備課到凌晨5點(diǎn),睡兩個(gè)小時(shí),8點(diǎn)半去講課,就這樣4天講課,我每天都是休息3小時(shí)左右。還好自己畢竟使用過DB2,而且也過了DB2認(rèn)證,還是有基礎(chǔ)的。這次講課雖然不太成功,但是畢竟通過了,勉強(qiáng)可以打60分吧,沒想到這次培訓(xùn)竟是我以后幾年培訓(xùn)生涯的開始。經(jīng)過這次講課后,我也看到了自己的差距,知道僅僅擁有認(rèn)證是不行的,因?yàn)榭蛻魡柕暮芏鄦栴},書本上是沒有的,說明自己還需要進(jìn)一步努力,而且自己看書有些概念雖然不太懂也不會太深入研究,但是如果講課你就自己必須把一些原理概念弄清楚,所以這需要對數(shù)據(jù)庫有更深入的學(xué)習(xí)。 后來經(jīng)過一些其他的渠道,IBM培訓(xùn)部知道我能講DB2并且有相關(guān)證書,就找我講DB2系列課程。所以從2001年開始,我就經(jīng)常作為IBM官方講師開始講DB2系列所有課程。我感覺到講課是個(gè)很好的學(xué)習(xí)過程,因?yàn)橹v一些內(nèi)容,你首先自己要搞清楚,這對提升自己有很大的幫助,我把課堂學(xué)員問的實(shí)際產(chǎn)生的問題自己深入地研究。我自己對培訓(xùn)有這樣的認(rèn)識,我是希望學(xué)員在這里聽你講3個(gè)小時(shí)要遠(yuǎn)遠(yuǎn)勝過自己看3個(gè)小時(shí),而且如果把講一堂課的內(nèi)容比喻一杯水,那么老師至少應(yīng)該儲備一桶水,才能駕馭。所以,我在講課準(zhǔn)備過程中,精心準(zhǔn)備實(shí)驗(yàn),深入和學(xué)員交流。爭取把一些概念能夠用淺顯易懂的例子來講解,而要想做到這些,首先自己必須對這個(gè)概念有深刻的理解。所以這在客觀上促進(jìn)了自己的學(xué)習(xí)?! ‰S著培訓(xùn)的增多,也有一些客戶找我去做一些實(shí)際的調(diào)優(yōu)工作。我記得第一次去客戶現(xiàn)場調(diào)優(yōu)是2001年去大連大通證券,當(dāng)時(shí)主要解決鎖等待問題??蛻舡h(huán)境用到了AIX和CICS環(huán)境。當(dāng)時(shí)雖然問題解決了,但自己心中還是感覺到比較虛,因?yàn)閷IX和CICS不了解,萬一如果是這兩個(gè)方面有問題,自己就沒辦法搞定了;同時(shí)認(rèn)識到一個(gè)復(fù)雜系統(tǒng)的調(diào)整往往不是單方面的,需要具備全面的知識。經(jīng)過這次事情后,我就在網(wǎng)上買了一個(gè)140的IBM工作站小機(jī),自己安裝AIX,開始學(xué)習(xí)AIX。這個(gè)期間我一邊學(xué)習(xí),一邊把AIX的認(rèn)證全部過掉。我記得非常清楚,為了做HA的實(shí)驗(yàn)著實(shí)費(fèi)了很大的功夫,因?yàn)闊o法搞到7133陣列,那時(shí)小型機(jī)不像今天這么普及。后來自己又學(xué)習(xí)了CICS、WebSphere、MQ和存儲,所以我認(rèn)為有目的的學(xué)習(xí),有壓力和動(dòng)力的學(xué)習(xí)效率是非常高的。就這樣,在我培訓(xùn)的過程中,我發(fā)現(xiàn)自己哪個(gè)方面薄弱并且這個(gè)方向有前途,我就開始學(xué)習(xí),不過那個(gè)時(shí)候我的技術(shù)主要以IBM為主。由于自己對培訓(xùn)比較用心以及客戶的好評,開始找我做培訓(xùn)的國內(nèi)培訓(xùn)機(jī)構(gòu)開始變多,也感覺到這個(gè)期間自己的技術(shù)水平增長很快?! ?002年11月,我參加首屆“IBM DeveloperWorksLive! China 2002”大會,并獲得IBM首次在國內(nèi)評選的“杰出軟件技術(shù)專家”獎(jiǎng),在6名獲獎(jiǎng)?wù)咧忻械?。獲得這個(gè)認(rèn)證后對我有很大的幫助,因?yàn)檎椅业娜烁嗔?,所?002、2003年是我技術(shù)提升最快的兩年,在這兩年我又陸續(xù)學(xué)習(xí)了HP-UX、WebSphere和MQ并通過了認(rèn)證。其實(shí)我有時(shí)感覺到如果你把一門技術(shù)研究得非常深非常透,這時(shí)你再去學(xué)習(xí)另一門技術(shù),就非常輕松,因?yàn)榧夹g(shù)是觸類旁通的。我在學(xué)習(xí)完AIX再去學(xué)習(xí)HP-UX就感覺非常輕松。同時(shí),在學(xué)習(xí)Oracle和DB2后再去學(xué)習(xí)Informix感覺到很容易。通過這種縱向的深入和橫向的比較,就會思考它們的區(qū)別,就能夠發(fā)現(xiàn)每一個(gè)產(chǎn)品的尺之所長、寸之所短,這樣技術(shù)視野更加全局。在學(xué)習(xí)過程中,不斷地把實(shí)踐和理論結(jié)合,不斷地補(bǔ)充理論來充實(shí)自己,知其然知其所以然。而且通過對一個(gè)產(chǎn)品的深入,往往能夠發(fā)現(xiàn)這個(gè)產(chǎn)品的缺點(diǎn)和需要改進(jìn)的地方。就拿DB2來說,它的每次版本更新的新特性我基本上在新版本沒有出來之前就猜得差不多了。因?yàn)橐皇俏沂琴N近真實(shí)用戶的,了解他們的真實(shí)需求;二是自己一直在用,自己不斷地總結(jié)思考;三是別的數(shù)據(jù)庫有,而DB2沒有,那么在下個(gè)版本就會增加。所以相對來說,對新版本的新特性學(xué)習(xí)就非常輕松了?! 【虳B2而言,我是國內(nèi)擁有DB2認(rèn)證最多的人,我擁有DB2 V5.2 、V7.1、V8.1和V9的全部認(rèn)證。我是國內(nèi)第一個(gè)把DB2 V8認(rèn)證全部通過的人,當(dāng)然這也是巧合,因?yàn)?003年3月非典我被困在深圳,在網(wǎng)上看到DB2 V8認(rèn)證從4月1日開始考,就在前一天報(bào)名注冊,第二天把DB2 V8(新特性、高級DBA、應(yīng)用開發(fā)、BI等所有認(rèn)證)全部pass?! ?004~2005年基本上是我最忙碌的兩年。那個(gè)時(shí)候找我講課的培訓(xùn)機(jī)構(gòu)以及性能調(diào)優(yōu)的客戶非常多,一年我基本上天天在天上飛(當(dāng)然學(xué)校導(dǎo)師那邊我是有辦法搞定的),培訓(xùn)機(jī)構(gòu)找我講課常常需要提前一個(gè)月預(yù)約時(shí)間。那時(shí)除了過年在家?guī)滋?,其他時(shí)間都是在做培訓(xùn)和診斷調(diào)優(yōu)等,足跡踏遍國內(nèi)主要城市。那時(shí)我基本上是國內(nèi)六大行開發(fā)中心和數(shù)據(jù)中心培訓(xùn)的指定老師,只要時(shí)間不沖突,還為北京銀信科技、山東農(nóng)信、廣東農(nóng)信、交行大集中IBP等項(xiàng)目做數(shù)據(jù)庫技術(shù)顧問。那時(shí)年輕很有精力,我記得有一次是2004年9月,我白天上午9點(diǎn)為上海移動(dòng)IT部門做AIX動(dòng)態(tài)邏輯分區(qū)(DLPAR)的培訓(xùn);17點(diǎn)打車前往揚(yáng)州,20點(diǎn)到達(dá)揚(yáng)州供電局協(xié)助他們進(jìn)行電力負(fù)荷控制系統(tǒng)項(xiàng)目上線,徹夜奮戰(zhàn)到凌晨3點(diǎn)半;然后連夜打的趕往上海,凌晨6點(diǎn)到達(dá)酒店;休息兩小時(shí),8點(diǎn)出發(fā),準(zhǔn)時(shí)出現(xiàn)在上海移動(dòng)培訓(xùn)現(xiàn)場。那時(shí)我對報(bào)酬不太在意,我想的是拼命積累技術(shù)和客戶資源,不斷對技術(shù)學(xué)習(xí)、鉆研、思考、提高,以及不斷向上成長和孜孜不倦的探索,我就是這樣在不斷的學(xué)習(xí)、積累以及實(shí)踐中成長起來的。 在很長一段時(shí)間內(nèi),我不斷奔波于國內(nèi)的各個(gè)城市,不計(jì)較出差、報(bào)酬,在我看來能夠不斷通過實(shí)踐讓自己成長是第一要義。而且去的客戶現(xiàn)場越多、處理的問題越多,就越發(fā)現(xiàn)自己的不足,然后就拼命地學(xué)習(xí),不斷地積累、總結(jié)和思考,這樣就進(jìn)入了一個(gè)良性循環(huán)。至今我仍然懷念那種充實(shí)、緊張和激情的黃金年代。2004年和2005年,我分別在上海、北京注冊了公司。一方面因?yàn)橐元?dú)立咨詢顧問的個(gè)人身份無法出具發(fā)票;另一方面,隨著項(xiàng)目越做越大,尤其是很多銀行的數(shù)據(jù)庫架構(gòu)和維護(hù)項(xiàng)目涉及合同金額也越來越大,需要簽訂合同,以公司的身份來簽合同更加合適。當(dāng)然這些年并非所有都是一帆風(fēng)順,也犯過一些重大錯(cuò)誤。例如,我曾經(jīng)在2002年5月1日把某機(jī)場的數(shù)據(jù)庫調(diào)死,導(dǎo)致機(jī)場航班信息管理系統(tǒng)癱瘓;早期也曾經(jīng)把證券系統(tǒng)因?yàn)檎{(diào)整而宕機(jī)。這些都對客戶造成了重大影響,同時(shí)也讓我思考總結(jié)自己的不足。也許這是成長必須要走的路。所以,經(jīng)過這兩次事件之后,我之后的調(diào)優(yōu)基本上沒有犯過錯(cuò)誤。 2006年8月我獲得“2006年中國首屆杰出數(shù)據(jù)庫工程師”稱號,也算是對我這么多年學(xué)習(xí)數(shù)據(jù)庫的一個(gè)總結(jié)吧。2007年開始,我專注于做一些大客戶的運(yùn)維,相應(yīng)就減少了培訓(xùn)的次數(shù)。2008年我被建設(shè)銀行以217萬年薪聘請為資深技術(shù)專家來維護(hù)Oracle和Informix數(shù)據(jù)庫。做技術(shù)而言,以一己之力能掙到年薪百萬這常常是我感到自豪的地方,也是讓我感覺到技術(shù)的魅力和自己這么多年對技術(shù)鉆研的認(rèn)可?! ≈聦W(xué)友 其實(shí)我講我的技術(shù)之路,主要給大家一些參考,尤其對在校學(xué)生,我希望我的學(xué)習(xí)之路大家能夠模仿(畢竟大師級的路是很難模仿的)。而且,這么多年,能取得這么一點(diǎn)小成績,勤奮、努力和堅(jiān)持一直是我看重的。因?yàn)橛辛诉@些,不至于機(jī)遇惠顧你時(shí),你悵然若失?! ≡诂F(xiàn)在的很多年輕人身上,我以為恰恰缺少的就是這樣的忘我與癡迷。在我熟悉的數(shù)據(jù)庫技術(shù)領(lǐng)域,很多年輕人越來越早地將注意力集中在薪水和職位上,開始變得浮躁,而我想說的是,往往是那些將諸如高薪與職位忘懷的人反而能更快地提升。不經(jīng)一番寒徹骨,安得梅花撲鼻香。這樣的道理人人都懂,可是能夠真正實(shí)施的人并不多。 所以,結(jié)合我的學(xué)習(xí)經(jīng)驗(yàn)與感悟,有16個(gè)字送給進(jìn)入這一領(lǐng)域的讀者:去除浮躁,認(rèn)真學(xué)習(xí),不斷積累,尋找機(jī)遇?! ∵@些年我做數(shù)據(jù)庫,相對于Oracle數(shù)據(jù)庫而言,我深深感到DB2技術(shù)書籍的匱乏,所以我一直想寫一套DB2方面的技術(shù)書籍。坦白地說,寫書是我掙錢性價(jià)比最低的一種方式,但是我一直感覺到自己有義務(wù)和責(zé)任去寫一些東西來給大家分享,也算是對自己10年DB2學(xué)習(xí)經(jīng)驗(yàn)的一個(gè)總結(jié)吧!但是過去一直沒有時(shí)間,直到今年奧運(yùn)保障期間,有了一些時(shí)間,我才寫了這套書。在這套書中,我把應(yīng)用開發(fā)和系統(tǒng)管理剝離開,分成兩條線來講解:《DB2應(yīng)用開發(fā)實(shí)戰(zhàn)指導(dǎo)》、《循序漸進(jìn)DB2》、《深入解析DB2》,《DB2數(shù)據(jù)庫性能調(diào)整與優(yōu)化》。其實(shí)關(guān)于DB2方面的技術(shù)還有很多我沒有涉及,例如高可用性、數(shù)據(jù)庫分區(qū)、HDAR、高級安全等,但是限于篇幅和時(shí)間,我無法做到全方位的解析?! £P(guān)于本書 本書側(cè)重在數(shù)據(jù)庫的性能調(diào)優(yōu)。而性能調(diào)優(yōu)是一個(gè)系統(tǒng)工程:全面監(jiān)控分析操作系統(tǒng)、I/O性能、內(nèi)存、應(yīng)用及數(shù)據(jù)庫才能快速找到問題根源;深刻理解DB2的鎖及并發(fā)機(jī)制、索引原理、數(shù)據(jù)庫參數(shù)、優(yōu)化器原理、SQL語句調(diào)優(yōu)等內(nèi)部機(jī)理才能有針對性地快速提出解決問題的方法;快照、db2pd、db2expln及事件監(jiān)控器等等則是必須要熟練掌握的工具。本書正是覆蓋了性能調(diào)優(yōu)所需要的全部領(lǐng)域,并提供了大量的性能調(diào)優(yōu)的實(shí)際案例?! ”緯到y(tǒng)性地總結(jié)了DB2數(shù)據(jù)庫的性能調(diào)整的方法、流程、思路和保持系統(tǒng)良好性能的注意要點(diǎn)。最后,與讀者分享了我10年積累的DB2性能調(diào)優(yōu)案例和經(jīng)驗(yàn)總結(jié)。本書所講內(nèi)容適用于DB2 V7、V8和V9.5的所有平臺?! ?shù)據(jù)庫學(xué)習(xí)之路 這里我對數(shù)據(jù)庫學(xué)習(xí)做個(gè)總結(jié):目前市場上雖然有Oracle、DB2、Informix、Sybase和SQL Server數(shù)據(jù)庫,但是Informix數(shù)據(jù)庫已經(jīng)被IBM收購,而Sybase數(shù)據(jù)庫在技術(shù)和市場上正走向沒落。那么剩下的其實(shí)就是Oracle、DB2和SQL Server數(shù)據(jù)庫。SQL Server數(shù)據(jù)庫非常好,但是很遺憾的是只能在Windows平臺使用,所以如果你深入研究SQL Server數(shù)據(jù)庫我只能說你可以養(yǎng)家糊口,但掙大錢的概率小,因?yàn)橛肧QL Sever數(shù)據(jù)庫的企業(yè)通常錢不多的,呵呵。而國內(nèi)做Oracle數(shù)據(jù)庫的人太多了,如果你想在Oracle領(lǐng)域出人頭地,難度極大。反而DB2數(shù)據(jù)庫做的人不太多,物以稀為貴。DB2數(shù)據(jù)庫廣泛應(yīng)用在銀行、電信、制造、零售、保險(xiǎn)等行業(yè),所以我強(qiáng)烈建議你學(xué)習(xí)DB2數(shù)據(jù)庫,鉆研IBM技術(shù)一般相對來說掙大錢的概率會大些。我們的時(shí)間精力是有限的,所以必須選擇好方向然后努力為之?! 」胖纱笫抡撸晃ㄓ谐乐?,亦唯有堅(jiān)忍不拔之志也!最后用這句話與大家共勉?! ≈轮x 本書在出版的過程中得到了清華大學(xué)出版社王軍編輯的大力支持!這套DB2書籍從選題、審稿到出版無不得到他的熱心幫助,在此致以深深的謝意!感謝我的好兄弟駱洪青和袁春光,他們審核了書中的大部分章節(jié)。同時(shí)也感謝中信銀行的胡瑞娟、蘇蘭芳和我的師弟林春,他們審核了部分章節(jié)并從用戶的角度給我提出了很多寶貴的建議!最后,謹(jǐn)以此書獻(xiàn)給我心愛的妻子,遇到她是我人生最大的成就! 新莊 于2009年新年 序二 2003年與新莊初次相識即給我留下了深刻印象,為人真誠、勤奮、踏實(shí)、富有熱情,有著雄厚的數(shù)據(jù)庫理論知識和高超的數(shù)據(jù)庫技術(shù),曾為大量的金融機(jī)構(gòu)及大型企業(yè)作過數(shù)據(jù)庫理論及操作培訓(xùn)。他的授課深入淺出,將枯燥的理論知識講得通俗易懂,贏得了所有培訓(xùn)人員和企業(yè)的高度肯定,為DB2數(shù)據(jù)庫知識在中國的普及作出了巨大貢獻(xiàn)。在實(shí)務(wù)上,新莊更是幫助多家金融企業(yè)和機(jī)構(gòu)解決了長期困擾的數(shù)據(jù)庫性能問題。 和書店內(nèi)滿是Oracle數(shù)據(jù)庫書籍不同的是,DB2數(shù)據(jù)庫雖進(jìn)入國內(nèi)年數(shù)已久,但僅有幾本IBM出版的介紹數(shù)據(jù)庫基本操作的書籍,介紹性能調(diào)優(yōu)、數(shù)據(jù)庫內(nèi)部機(jī)理機(jī)制等方面的書籍更是非常缺乏。本人在金融行業(yè)軟件開發(fā)以及系統(tǒng)優(yōu)化的10年時(shí)間里,深刻感受到DB2相關(guān)書籍稀少的困苦。偶與新莊談起資料缺乏、高水平DB2書籍稀少的苦惱,均感慨DB2在金融行業(yè)使用如此廣泛,大家在開發(fā)和運(yùn)行優(yōu)化時(shí)卻僅靠口口相傳,實(shí)在不符合DB2在國內(nèi)金融行業(yè)的地位,也不利于這些核心系統(tǒng)的安全穩(wěn)定運(yùn)行。因而突然看到新莊寫了這樣一本深入淺出、講解極為透徹且在實(shí)務(wù)上也極具操作性的書,不由得喜出望外。 本書側(cè)重于介紹DB2數(shù)據(jù)庫的性能調(diào)優(yōu),而性能調(diào)優(yōu)是一個(gè)系統(tǒng)工程:全面監(jiān)測分析操作系統(tǒng)、IO性能、網(wǎng)絡(luò)傳輸、應(yīng)用及數(shù)據(jù)庫才能快速找到問題根源;深刻理解DB2的鎖及并發(fā)機(jī)制、索引原理、數(shù)據(jù)庫參數(shù)、優(yōu)化器原理、SQL語句調(diào)優(yōu)等內(nèi)部機(jī)理才能有針對性地快速提出解決問題的方法;快照、db2pd、db2expln及事件監(jiān)控器等則是必須要熟練掌握的工具。這本書正是覆蓋了性能調(diào)優(yōu)所需要的全部領(lǐng)域,并提供了大量的性能調(diào)優(yōu)的實(shí)際案例,為DB2開發(fā)、維護(hù)及系統(tǒng)優(yōu)化人員都帶來了福音,更為包括金融行業(yè)在內(nèi)的眾多核心系統(tǒng)的穩(wěn)定運(yùn)行及優(yōu)化提供了指導(dǎo)利器。本書的推廣和熱賣,我極具信心! 海通證券股份有限公司信息技術(shù)部總經(jīng)理助理 國內(nèi)數(shù)據(jù)庫頂尖高手 曾任國內(nèi)某證券行業(yè)TOP5軟件公司技術(shù)總監(jiān) 曾主持開發(fā)期貨交易所核心系統(tǒng),并主持設(shè)計(jì)開發(fā)多家大型證券公司核心交易系統(tǒng)及風(fēng)控等管理系統(tǒng),在金融IT領(lǐng)域有著豐富的實(shí)踐經(jīng)驗(yàn)和專業(yè)背景知識,特別在大型數(shù)據(jù)庫、大型系統(tǒng)架構(gòu)設(shè)計(jì)等方面有著深厚的理論功底及實(shí)踐經(jīng)驗(yàn)?! ⊥鹾闈 ?009年1月 序三(我與牛君初 有些人,在你第一次見到時(shí)會驀然想起四個(gè)字:相見恨晚。我和牛新莊就屬于這樣的朋友。這一次他完成了《DB2數(shù)據(jù)庫性能調(diào)整和優(yōu)化》一書,囑我寫點(diǎn)文字,我欣然允諾,雖然在DB2方面我是沒有什么發(fā)言權(quán)的?! £P(guān)于小牛 我和小牛相識于2006年,在“中國首屆杰出數(shù)據(jù)庫工程師”評選活動(dòng)中,我們?nèi)雵饲笆瑫r(shí)獲得了“杰出數(shù)據(jù)庫工程師”的稱號。在最終評審的現(xiàn)場答辯之后,我們暢談良久,探討個(gè)人愛好、答辯主題、數(shù)據(jù)庫技術(shù),甚至職業(yè)發(fā)展等等。在眾多問題上的一致還并不是最重要的,最重要的是我們發(fā)現(xiàn)彼此的技術(shù)經(jīng)歷、個(gè)人性格等等竟然具有極大的相似性。在這樣的機(jī)緣巧合之下,我們成了朋友?! 〉谝淮我姷叫∨r(shí),他穿白色襯衫,肩背黑色電腦包,一副行色匆匆、獨(dú)闖天涯的形象,以至于多年之后,我記憶里的他還是依然如初?! ≌劦皆诿鎸夹g(shù)的學(xué)習(xí)、鉆研、思考、提高,以及不斷向上的成長,我們都經(jīng)歷了孜孜不倦的探索過程。小牛是在不斷的學(xué)習(xí)、積累以及實(shí)踐中成長起來的。在很長一段時(shí)間內(nèi),他不斷奔波于國內(nèi)的各個(gè)城市,他不計(jì)較出差、也不計(jì)較報(bào)酬,在他看來能夠不斷通過實(shí)踐讓自己成長是第一要義。同樣,在這很長一段時(shí)間內(nèi),除了工作學(xué)習(xí)之外,其他一切都不在他的考慮范圍之內(nèi)?! 【瓦@樣經(jīng)歷了在別人看來是癡迷、苦修一樣的生活之后,終于成就了今日的一代大家?! ≡诂F(xiàn)在的很多年輕人身上,我以為恰恰缺少的就是這樣的忘我與癡迷。在我熟悉的Oracle技術(shù)領(lǐng)域,很多年輕人越來越早地將注意力集中在薪水和職位上,開始變得浮躁,而我想說的是,往往是那些將諸如高薪與職位忘懷的人反而能更快地抵達(dá)。“不經(jīng)一番寒徹骨,安得梅花撲鼻香”,這樣的道理人人都懂,可是能夠真正實(shí)施的人并不多?! ∷裕Y(jié)合我們的經(jīng)驗(yàn)與感悟,有16個(gè)字送給進(jìn)入這一領(lǐng)域的讀者:去除浮躁,認(rèn)真學(xué)習(xí),不斷積累,尋找機(jī)遇。 關(guān)于本書 在技術(shù)上,小牛幾乎是無可挑剔的。他涉獵極廣,在數(shù)據(jù)庫方面,對DB2、Oracle都具有精深的造詣,也正因?yàn)閺V博的知識與豐富的經(jīng)驗(yàn),他才能夠敏銳地洞察不同數(shù)據(jù)庫的尺之所短、寸之所長。在和他關(guān)于技術(shù)的討論中,經(jīng)常讓我受益匪淺?! ∈袌錾详P(guān)于DB2的書籍本就不多,結(jié)合實(shí)踐的經(jīng)驗(yàn)總結(jié)就更是鮮見,小牛這本書無疑會給致力于學(xué)習(xí)與管理DB2數(shù)據(jù)庫的技術(shù)人員們帶來福音。 性能優(yōu)化從來都不是單純的事情,要想提高數(shù)據(jù)庫的性能,必須綜合考慮數(shù)據(jù)庫、操作系統(tǒng)、存儲甚至應(yīng)用架構(gòu)的設(shè)計(jì),小牛將這些技術(shù)內(nèi)容全面地涵蓋在了本書之中,并且通過最后整整一章的內(nèi)容來講解實(shí)際案例的診斷過程,理論與實(shí)踐相結(jié)合是最好的學(xué)習(xí)方法,這本書就是這樣將精彩的內(nèi)容呈現(xiàn)給我們的?! £P(guān)于勤奮 在技術(shù)道路上,我們一致認(rèn)為能夠與大家分享的最重要的兩個(gè)字就是——勤奮。也正是這兩個(gè)字,才使我們成為惺惺相惜的好友?! ∥以?jīng)在《循序漸進(jìn)Oracle》一書的后記中寫過一段關(guān)于勤奮的文字,轉(zhuǎn)錄在這里,因?yàn)檫@種勤奮的態(tài)度是我和小牛共同信奉的信條?! τ谖覀€(gè)人,壓力隨時(shí)都在肩上。而勤奮是我們最鋒利的武器。 2005年,偶然讀到王小慧的作品——《我的視覺日記》,感覺極為震撼。那本書我認(rèn)認(rèn)真真地讀過很多次,書的內(nèi)容中,至今記憶猶新的是書尾列出的作者作品年表。除了眾多的攝影、電影拍攝與展覽活動(dòng)外,作者幾乎保持了每年2、3本的作品出版速度,這需要多么大的勤奮付出以及堅(jiān)持不懈??! 有一位記者曾經(jīng)這樣寫道:在她面前你會覺得慚愧,覺得自己至多是個(gè)中等水平的人,而且無可救藥的懶惰。 這段話讓我經(jīng)常想起小牛,他比我年輕(所以我稱他小牛),但是其成就卻常讓我汗顏,他做學(xué)問至博士,做技術(shù)涉獵與范圍又遠(yuǎn)較我廣泛。所以我經(jīng)常以小牛為鑒,警示自己不可懈怠。有一位可以為鑒的朋友,實(shí)為人生之幸運(yùn)?! 《P(guān)于勤奮,更讓人敬佩的是另外一位大師——李敖,據(jù)說他曾經(jīng)每月寫作一本書,連續(xù)寫了十年?! ∵@些天才橫溢的作家尚且如此至為勤奮,而我們,唯有更為努力?! ∷?,最后,雖然是在與文學(xué)完全不同的這條技術(shù)道路上,我仍然只有兩個(gè)字作為最后的分享——勤奮?! —?dú)立咨詢顧問,Oracle ACE 總監(jiān),《深入淺出Oracle》、《循序漸進(jìn)Oracle》作者 蓋國強(qiáng)(eygle) 2009年1月 序四 與牛新莊的接觸源于10年前在大學(xué)里一起做項(xiàng)目,那時(shí)“恰同學(xué)少年”,雖無偉人們指點(diǎn)江山之意氣風(fēng)發(fā),卻也會因一個(gè)技術(shù)難題的攻克而一道去學(xué)校排檔里大快朵頤。牛新莊對技術(shù)追求之不懈在學(xué)校中就已經(jīng)展現(xiàn)出那種“為伊消得人憔悴,衣帶漸寬終不悔”的境界。在21世紀(jì)初的狂熱的互聯(lián)網(wǎng)大潮中,牛新莊從紛繁復(fù)雜的IT技術(shù)中選擇了數(shù)據(jù)庫作為自己的主攻方向并且一直持續(xù)至今,是為一綱舉而百目張,終于成為國內(nèi)數(shù)據(jù)庫頂尖級高手?! ∨P虑f涉獵極廣,他從數(shù)據(jù)庫出發(fā),向下延伸至操作系統(tǒng)、存儲,向上延伸至中間件,幾乎所有企業(yè)應(yīng)用涉及的平臺他都有廣泛而深入的研究,如AIX、HP-UX、IBM存儲、EMC存儲、Oracle、DB2、Informix、WebSphere、CICS、MQ等。這些知識的融會貫通使得牛新莊在解決客戶碰到的各種實(shí)際問題時(shí),如庖丁解牛般游刃有余。牛新莊在各種實(shí)踐的基礎(chǔ)上不斷總結(jié),能夠從更高的視角反思DBA遇到的各種問題,并且上升到方法論,始有這套書的雛形。 DB2的學(xué)習(xí)資料在其信息文檔和網(wǎng)絡(luò)中有很多,但知識點(diǎn)分散,多不成體系,更是缺乏專家實(shí)踐應(yīng)用經(jīng)驗(yàn)總結(jié)。這套書凝聚了牛新莊大量的心血,是其10年DB2應(yīng)用經(jīng)驗(yàn)的總結(jié)。這套書特點(diǎn)是注重實(shí)用,內(nèi)容由淺及深,涵蓋DB2的管理、運(yùn)行維護(hù)、應(yīng)用開發(fā)、內(nèi)核及架構(gòu)的剖析,以及性能調(diào)整和優(yōu)化。書中還有大量的提示點(diǎn),雖只有寥寥數(shù)語,確是作者多年反復(fù)成功亦或失敗的DB2實(shí)踐體會,值得讀者反復(fù)回味?! ∪绻阅軉栴}一直困擾著您,您也不要期望有一顆靈丹妙藥,只需一試即能解決所有問題。性能優(yōu)化的問題,是對DBA綜合能力的一個(gè)考驗(yàn),需要DBA親身實(shí)踐去尋找答案。但是在尋找答案的過程中您必須有一個(gè)正確、完整而且有組織的指引,否則這個(gè)答案您將永遠(yuǎn)找不到。有人說看書是按圖索驥,其實(shí)按圖索驥又有何妨,至少您心里會有底,知道自己離目標(biāo)的距離是遠(yuǎn)是近。讀者如果能從本書這個(gè)“圖”索到性能瓶頸這個(gè)“驥”,也就達(dá)到了作者授業(yè)、解惑之目標(biāo)了?! ”本┿y信長遠(yuǎn)軟件技術(shù)有限公司 總經(jīng)理 數(shù)據(jù)庫高級專家 IBM官方資深培訓(xùn)講師 駱洪青 2009年3月
內(nèi)容概要
本書側(cè)重于介紹DB2數(shù)據(jù)庫的性能調(diào)優(yōu)。性能調(diào)優(yōu)是一個(gè)系統(tǒng)工程:全面監(jiān)控分析操作系統(tǒng)、I/O性能、內(nèi)存、應(yīng)用及數(shù)據(jù)庫才能快速找到問題根源;深刻理解DB2的鎖及并發(fā)機(jī)制、索引原理、數(shù)據(jù)庫參數(shù)、優(yōu)化器原理、SQL語句調(diào)優(yōu)等內(nèi)部機(jī)理才能有針對性地快速提出解決問題的方法;快照、db2pd、db2expln及事件監(jiān)控器等則是必須熟練掌握的工具。這本書正是覆蓋了性能調(diào)優(yōu)所需要的全部領(lǐng)域,并提供了大量的性能調(diào)優(yōu)的實(shí)際案例。 本書系統(tǒng)性地總結(jié)了DB2數(shù)據(jù)庫性能調(diào)整的方法、流程、思路和保持系統(tǒng)良好性能的注意要點(diǎn)。最難得的是作者分享了10年積累的DB2性能調(diào)優(yōu)案例和經(jīng)驗(yàn)總結(jié)。
書籍目錄
第1章 性能調(diào)整概述 1.1 性能概述 1.2 性能評估 1.3 建立性能目標(biāo) 1.4 什么時(shí)候需要做性能調(diào)整 1.5 性能調(diào)整準(zhǔn)則 1.6 性能調(diào)整的方法和過程 1.6.1 性能調(diào)整的步驟 1.6.2 性能調(diào)整的限制 1.6.3 向客戶了解情況 1.6.4 性能調(diào)整流程圖 1.7 性能調(diào)整總結(jié) 第2章 存儲I/O設(shè)計(jì) 2.1 存儲基本概念 2.1.1 硬盤 2.1.2 磁盤陣列技術(shù) 2.1.3 存儲的Cache 2.1.4 IOPS 2.1.5 網(wǎng)絡(luò)存儲技術(shù) 2.2 存儲架構(gòu) 2.2.1 存儲I/O處理過程 2.2.2 應(yīng)用系統(tǒng)I/O流動(dòng)圖 2.2.3 RAID IOPS 2.2.4 RAID 和RAID 的比較 2.3 存儲相關(guān)性能調(diào)整案例 2.4 存儲I/O設(shè)計(jì)總結(jié) 第3章 操作系統(tǒng)相關(guān)性能問題 3.1 HP-UX系統(tǒng)性能監(jiān)控綜述 3.1.1 監(jiān)控資源對象和標(biāo)準(zhǔn) 3.1.2 監(jiān)控工具 3.1.3 監(jiān)控系統(tǒng)總體運(yùn)行狀態(tài) 3.1.4 性能狀態(tài)的判定流程和監(jiān)控命令 3.2 AIX性能監(jiān)控綜述 3.2.1 監(jiān)控工具 3.2.2 監(jiān)控系統(tǒng)總體運(yùn)行狀態(tài) 3.2.3 監(jiān)控CPU性能 3.2.4 監(jiān)控內(nèi)存使用 3.2.5 監(jiān)控存儲系統(tǒng)狀態(tài) 3.2.6 監(jiān)控網(wǎng)絡(luò)狀態(tài) 3.3 操作系統(tǒng)性能優(yōu)化 3.3.1 直接I/O和并發(fā)I/O 3.3.2 異步I/O和同步I/O 3.3.3 minpout和maxpout 3.3.4 文件系統(tǒng)和裸設(shè)備 3.3.5 負(fù)載均衡及條帶化(Striping) 3.4 邏輯卷和lvmo優(yōu)化 3.4.1 使用lvmo進(jìn)行優(yōu)化 3.4.2 卷組 pbuf 池 3.4.3 pbuf設(shè)置不合理導(dǎo)致性能問題調(diào)整案例 3.4.4 使用 ioo 進(jìn)行優(yōu)化 3.5 總結(jié) 第4章 數(shù)據(jù)庫物理設(shè)計(jì)和邏輯設(shè)計(jì) 4.1 數(shù)據(jù)庫物理設(shè)計(jì) 4.1.1 表空間容器放置原則 4.1.2 數(shù)據(jù)庫物理設(shè)計(jì)原則 4.2 數(shù)據(jù)庫邏輯設(shè)計(jì) 4.2.1 緩沖池設(shè)計(jì)原則 4.2.2 表空間設(shè)計(jì)原則 4.3 使用Autoconfig設(shè)計(jì)數(shù)據(jù)庫 4.4 其他高級設(shè)計(jì)技術(shù) 4.4.1 表分區(qū)及應(yīng)用案例 4.4.2 數(shù)據(jù)庫分區(qū)及應(yīng)用案例 4.4.3 多維群集(MDC)及應(yīng)用案例 4.4.4 物化查詢表及應(yīng)用案例 4.4.5 MDC、數(shù)據(jù)庫分區(qū)、MQT和表分區(qū)配合使用 4.4.6 表壓縮及應(yīng)用案例 4.4.7 表壓縮應(yīng)用案例二 4.4.8 XML及應(yīng)用案例 4.5 數(shù)據(jù)庫設(shè)計(jì)總結(jié) 4.5.1 表空間與表設(shè)計(jì)方面的考慮 4.5.2 索引設(shè)計(jì)方面的考慮 4.5.3 緩沖池方面的考慮 4.5.4 總結(jié) 第5章 DB2性能監(jiān)控 5.1 快照監(jiān)視器案例 5.1.1 監(jiān)控動(dòng)態(tài)SQL語句 5.1.2 監(jiān)控臨時(shí)表空間使用 5.2 事件監(jiān)視器及監(jiān)控案例 5.3 利用表函數(shù)監(jiān)控 5.4 性能管理視圖及案例 5.4.1 監(jiān)控緩沖池命中率 5.4.2 監(jiān)控Package Cache大小 5.4.3 監(jiān)控執(zhí)行成本最高的SQL語句 5.4.4 監(jiān)控運(yùn)行最長的SQL語句 5.4.5 監(jiān)控SQL準(zhǔn)備和預(yù)編譯時(shí)間最長的SQL語句 5.4.6 監(jiān)控執(zhí)行次數(shù)最多的SQL語句 5.4.7 監(jiān)控排序次數(shù)最多的SQL語句 5.4.8 監(jiān)控LOCK WAIT等待時(shí)間 5.4.9 監(jiān)控LOCK CHAIN 5.4.10 監(jiān)控鎖內(nèi)存使用 5.4.11 監(jiān)控鎖升級、死鎖和鎖超時(shí) 5.4.12 監(jiān)控全表掃描的SQL 5.4.13 檢查page cleaners是否足夠 5.4.14 監(jiān)控prefecher是否足夠 5.4.15 監(jiān)控?cái)?shù)據(jù)庫內(nèi)存使用 5.4.16 監(jiān)控日志使用情況 5.4.17 監(jiān)控占用日志空間最舊的交易 5.4.18 用SQL監(jiān)控健康指示器 5.4.19 監(jiān)控存儲路徑 5.4.20 追蹤監(jiān)控歷史 5.5 db2pd 5.5.1 常用db2pd監(jiān)控選項(xiàng)和示例 5.5.2 使用db2pd監(jiān)控死鎖案例 5.5.3 db2pd使用問題總結(jié) 5.6 db2mtrk及監(jiān)控案例 5.7 本章小結(jié) 第6章 數(shù)據(jù)庫配置參數(shù)調(diào)整 6.1 數(shù)據(jù)庫配置參數(shù) 6.2 監(jiān)控和調(diào)優(yōu)實(shí)例(DBM)配置參數(shù) 6.2.1 代理程序相關(guān)配置參數(shù) 6.2.2 SHEAPTHRES 6.2.3 FCM_NUM_BUFFERS 6.2.4 SHEAPTHRES_SHR 6.2.5 INTRA_PARALLEL 6.2.6 MON_HEAP_SZ 6.2.7 QUERY_HEAP_SZ 6.3 監(jiān)控和調(diào)優(yōu)DB配置參數(shù) 6.3.1 緩沖池大小 6.3.2 日志緩沖區(qū)大?。↙OGBUFSZ) 6.3.3 應(yīng)用程序堆大小(APPHEAPSZ) 6.3.4 SORTHEAP和SHEAPTHRES 6.3.5 鎖相關(guān)配置參數(shù) 6.3.6 活動(dòng)應(yīng)用程序的最大數(shù)目(MAXAPPLS) 6.3.7 PKGCACHESZ 6.3.8 CATALOGCACHE_SZ 6.3.9 異步頁清除程序的數(shù)目(NUM_IOCLEANERS) 6.3.10 異步I/O 服務(wù)器的數(shù)目(NUM_IOSERVERS) 6.3.11 組提交數(shù)目(MINCOMMIT) 6.3.12 AVG_APPLS 6.3.13 CHNGPGS_THRESH(DB) 6.3.14 MAXFILOP 6.3.15 LOGPRIMARY、LOGSECOND和LOGFILSZ 6.3.16 STMTHEAP 6.3.17 DFT_QUERYOPT 6.3.18 UTIL_HEAP_SZ (DB) 6.4 調(diào)整DB2概要注冊變量 6.4.1 DB2_PARALLEL_IO 6.4.2 DB2_EVALUNCOMMITTED 6.4.3 DB2_SKIPDELETED 6.4.4 DB2_SKIPINSERTED 6.4.5 DB2_USE_PAGE_CONTAINER_TAG 6.4.6 DB2_SELECTIVITY 6.5 內(nèi)存自動(dòng)調(diào)優(yōu) 6.5.1 內(nèi)存自動(dòng)調(diào)優(yōu)示例 6.5.2 啟用內(nèi)存自動(dòng)調(diào)優(yōu)及相關(guān)參數(shù) 6.6 總結(jié) 第7章 鎖和并發(fā) 7.1 鎖等待及調(diào)整案例 7.1.1 鎖等待問題解決流程和步驟 7.1.2 捕獲引起鎖等待的SQL 7.1.3 利用db2pd捕獲鎖超時(shí) 7.2 鎖升級及調(diào)整案例 7.2.1 監(jiān)控鎖升級 7.2.2 鎖升級調(diào)整 7.3 死鎖及調(diào)整案例 7.3.1 利用事件監(jiān)視器監(jiān)控死鎖 7.3.2 死鎖案例 7.3.3 最小化死鎖建議 7.4 隔離級別與鎖 7.4.1 可重復(fù)讀(RR—Repeatable Read) 7.4.2 讀穩(wěn)定性(RS—Read Stability) 7.4.3 游標(biāo)穩(wěn)定性(CS—Cursor Stability) 7.4.4 未提交讀(UR—Uncommitted Read) 7.4.5 隔離級別加鎖總結(jié) 7.4.6 隔離級別總結(jié) 7.5 最大化并發(fā)性 7.5.1 選擇合適的隔離級別 7.5.2 盡量避免鎖等待、鎖升級和死鎖 7.5.3 設(shè)置合理的注冊變量 7.6 鎖相關(guān)的性能問題總結(jié) 7.7 鎖與應(yīng)用程序開發(fā) 7.8 本章小結(jié) 第8章 索引設(shè)計(jì)與優(yōu)化 8.1 索引概念 8.1.1 索引優(yōu)點(diǎn) 8.1.2 索引類型 8.2 索引結(jié)構(gòu) 8.3 理解索引訪問機(jī)制 8.4 索引設(shè)計(jì) 8.4.1 創(chuàng)建索引 8.4.2 創(chuàng)建集群索引 8.4.3 創(chuàng)建雙向索引 8.4.4 完全索引訪問(index access only) 8.4.5 與創(chuàng)建索引相關(guān)的問題 8.4.6 創(chuàng)建索引示例 8.5 索引創(chuàng)建原則與示例 8.5.1 索引與謂詞 8.5.2 根據(jù)查詢所使用的列建立索引 8.5.3 根據(jù)條件語句中謂詞的選擇度創(chuàng)建索引 8.5.4 避免在建有索引的列上使用函數(shù) 8.5.5 在那些需要被排序的列上創(chuàng)建索引 8.5.6 合理使用INCLUDE關(guān)鍵詞創(chuàng)建索引 8.5.7 指定索引的排序?qū)傩? 8.6 影響索引性能的相關(guān)配置 8.6.1 設(shè)置影響索引性能的配置參數(shù) 8.6.2 為索引指定不同的表空間 8.6.3 確保索引的集群度 8.6.4 使表和索引統(tǒng)計(jì)信息保持最新 8.6.5 重組索引 8.7 索引維護(hù) 8.7.1 異步索引清除(AIC) 8.7.2 聯(lián)機(jī)索引整理碎片 8.8 DB2 Design Advisor(db2advis) 8.9 索引調(diào)整總結(jié) 8.9.1 索引設(shè)計(jì)總結(jié) 8.9.2 索引性能總結(jié) 第9章 DB2優(yōu)化器 9.1 DB2優(yōu)化器介紹 9.2 SQL語句執(zhí)行過程 9.3 優(yōu)化器組件和工作原理 9.3.1 查詢重寫方法和示例:謂詞移動(dòng)、合并和轉(zhuǎn)換 9.3.2 查詢重寫示例:視圖合并 9.3.3 查詢器重寫示例:消除DISTINCT 9.3.4 查詢器重寫示例:隱含謂詞 9.4 掃描方式 9.4.1 全表掃描 9.4.2 索引掃描 9.5 連接方法 9.5.1 嵌套循環(huán)連接 9.5.2 合并連接 9.5.3 哈希(hash)連接 9.5.4 選擇最佳連接的策略 9.6 優(yōu)化級別 9.7 如何影響優(yōu)化器來提高性能 9.7.1 使DB2統(tǒng)計(jì)信息保持最新 9.7.2 構(gòu)建適當(dāng)?shù)乃饕? 9.7.3 配置合理的數(shù)據(jù)庫配置參數(shù) 9.7.4 選擇合適的優(yōu)化級別 9.7.5 合理的存儲I/O設(shè)計(jì) 9.7.6 良好的應(yīng)用程序設(shè)計(jì)和編碼 9.8 優(yōu)化器總結(jié) 第10章 統(tǒng)計(jì)信息更新與碎片整理 10.1 統(tǒng)計(jì)信息更新 10.1.1 統(tǒng)計(jì)信息的重要性 10.1.2 統(tǒng)計(jì)信息更新示例 10.1.3 LIKE STATISTICS統(tǒng)計(jì)信息更新 10.1.4 列組統(tǒng)計(jì)信息更新 10.1.5 分布統(tǒng)計(jì)信息更新 10.1.6 統(tǒng)計(jì)信息更新策略 10.2 碎片整理 10.2.1 碎片產(chǎn)生機(jī)制和影響 10.2.2 確定何時(shí)重組表和索引 10.2.3 執(zhí)行表、索引檢查是否需要做REORG 10.3 重新綁定程序包 10.4 本章小結(jié) 第11章 SQL語句調(diào)優(yōu) 11.1 通過監(jiān)控找出最消耗資源的SQL語句 11.2 通過解釋工具分析SQL語句執(zhí)行計(jì)劃 11.2.1 解釋表 11.2.2 Visual Explain(可視化解釋) 11.2.3 db2expln 11.2.4 db2exfmt 11.2.5 各種解釋工具比較 11.2.6 如何從解釋信息中獲取有價(jià)值的建議 11.3 理解SQL語句如何工作 11.3.1 理解謂詞類型 11.3.2 排序和分組 11.3.3 連接方法 11.3.4 掃描方式 11.4 SQL調(diào)優(yōu)案例 11.4.1 用一條語句即可做到時(shí)避免使用多條語句 11.4.2 合理使用NOT IN和NOT EXISTS 11.4.3 合理使用子查詢減少數(shù)據(jù)掃描和利用索引 11.4.4 調(diào)整表的連接順序,減小中間結(jié)果集的數(shù)據(jù)量 11.4.5 在有偏差數(shù)據(jù)的情況下使用參數(shù)標(biāo)記時(shí),指定選擇性 11.4.6 SQL使用UDF代替查詢中復(fù)雜的部分 11.4.7 從多個(gè)SQL語句到一個(gè) SQL表達(dá)式 11.4.8 使用SQL一次處理一個(gè)集合語義 11.4.9 在無副作用的情況下,請使用SQL 函數(shù) 11.4.10 小結(jié) 11.5 提高應(yīng)用程序性能 11.5.1 良好的SQL編碼規(guī)則 11.5.2 提高SQL編程性能 11.5.3 改進(jìn)游標(biāo)性能 11.5.4 根據(jù)業(yè)務(wù)邏輯選擇最低粒度的隔離級別 11.5.5 通過REOPT綁定選項(xiàng)來提高性能 11.5.6 統(tǒng)計(jì)信息、碎片整理和重新綁定 11.5.7 避免不必要的排序 11.5.8 在C/S環(huán)境中利用SQL存儲過程降低網(wǎng)絡(luò)開銷 11.5.9 高并發(fā)環(huán)境下使用連接池 11.5.10 使用Design Advisor(db2advis)建議索引 11.5.11 提高批量刪除、插入和更新速度 第12章 DB2調(diào)優(yōu)案例、問題總結(jié)和技巧 12.1 調(diào)優(yōu)案例一:某移動(dòng)公司存儲設(shè)計(jì)不當(dāng)和SQL引起的I/O瓶頸 12.2 調(diào)優(yōu)案例二:某銀行知識庫系統(tǒng)鎖等待、鎖升級引起性能瓶頸 12.3 調(diào)優(yōu)案例三:某汽車制造商ERP系統(tǒng)通過調(diào)整統(tǒng)計(jì)信息提高性能 12.4 調(diào)優(yōu)案例四:某農(nóng)信社批量代收電費(fèi)批處理慢調(diào)優(yōu)案例 12.5 調(diào)優(yōu)學(xué)習(xí)案例:利用壓力測試程序?qū)W習(xí)DB2調(diào)優(yōu) 后記 參考文獻(xiàn)
章節(jié)摘錄
存儲I/O設(shè)計(jì) 對于任何程序的運(yùn)行來說,最慢、最花費(fèi)時(shí)間的操作實(shí)際上是從磁盤中檢索數(shù)據(jù)。這主要緣于磁盤 I/O 訪問中存在的物理機(jī)械過程(磁頭旋轉(zhuǎn)和尋道)。盡管磁盤存儲技術(shù)在最近幾年取得了極大的進(jìn)步,但磁盤的旋轉(zhuǎn)速度卻沒有太大的提高。您必須清楚這樣一個(gè)事實(shí):在一定條件下,RAM 訪問僅需要大概 540個(gè) CPU時(shí)鐘周期,而磁盤訪問則需要花費(fèi)大概20 000 000個(gè)CPU 時(shí)鐘周期。很明顯,系統(tǒng)中訪問數(shù)據(jù)最薄弱的環(huán)節(jié)就是磁盤 I/O 存儲系統(tǒng),從性能調(diào)整的角度來說,就是確保磁盤數(shù)據(jù)布局不會成為更嚴(yán)重的瓶頸。糟糕的數(shù)據(jù)布局將會給 I/O 性能帶來更大的影響。在對系統(tǒng)進(jìn)行任何優(yōu)化活動(dòng)之前,首先應(yīng)該了解您的存儲 I/O 系統(tǒng)的物理體系結(jié)構(gòu),因?yàn)槿绻O(shè)計(jì)的存儲 I/O 系統(tǒng)非常糟糕,并且其中包含慢速磁盤,或者適配器的使用非常低效,那么其他的任何優(yōu)化工作都無法提供幫助。 數(shù)據(jù)庫的作用就是實(shí)現(xiàn)對數(shù)據(jù)的管理和查詢。任何一個(gè)數(shù)據(jù)庫系統(tǒng),必然存在對數(shù)據(jù)的大量讀、寫操作。所以I/O問題也往往是導(dǎo)致數(shù)據(jù)庫性能問題的重要原因。要控制好數(shù)據(jù)庫的整體I/O性能,在規(guī)劃數(shù)據(jù)庫架構(gòu)時(shí)就需要做好存儲I/O系統(tǒng)的設(shè)計(jì)和配置。例如,將對I/O要求不同的文件放置在不同的存儲設(shè)備上;規(guī)劃表空間容器的分布、均衡I/O負(fù)擔(dān)、使用并行I/O訪問等。在一個(gè)應(yīng)用系統(tǒng)的邏輯部署和物理部署圖中,存儲和操作系統(tǒng)位于應(yīng)用系統(tǒng)體系結(jié)構(gòu)的最底層。而數(shù)據(jù)庫是部署在操作系統(tǒng)和存儲層之上的,所以我們在做數(shù)據(jù)庫的物理設(shè)計(jì)和邏輯設(shè)計(jì)之前,必須先做好存儲I/O設(shè)計(jì)。存儲I/O設(shè)計(jì)中最大的一個(gè)原則就是將I/O訪問的分布最大限度地平衡在所有可以利用的物理設(shè)備上。 本章主要內(nèi)容包括: ? 存儲基本概念 ? 存儲架構(gòu) ? 存儲相關(guān)性能調(diào)整案例 ? 存儲設(shè)計(jì)性能相關(guān)問題 ? 存儲I/O設(shè)計(jì)總結(jié) 2.1 存儲基本概念 關(guān)于存儲的概念太多,許多已經(jīng)超出了本書的討論范圍。本章主要講解最常見的幾個(gè)概念,它們是我們進(jìn)行存儲I/O設(shè)計(jì)所必須掌握的。 2.1.1 硬盤 硬盤處于整個(gè)存儲系統(tǒng)的最底層,核心的業(yè)務(wù)數(shù)據(jù)通常都存放在硬盤上。我們從硬盤上讀取一次I/O要花費(fèi)的時(shí)間如下: 硬盤上一次I/O時(shí)間=磁盤尋道時(shí)間+磁頭旋轉(zhuǎn)到特定扇區(qū)時(shí)間+傳輸時(shí)間+延遲 圖2-1所示的硬盤I/O傳輸圖中標(biāo)識了磁頭在不同位置的尋道時(shí)間。衡量一個(gè)磁盤的I/O能力有如下幾個(gè)指標(biāo): 圖2-1 磁盤I/O傳輸圖 ● 硬盤的轉(zhuǎn)速(Rotational Speed):也就是硬盤電機(jī)主軸的轉(zhuǎn)速,轉(zhuǎn)速是決定硬盤內(nèi)部傳輸率的關(guān)鍵因素之一,它的快慢在很大程度上影響了硬盤的速度。同時(shí),轉(zhuǎn)速的快慢也是區(qū)分硬盤檔次的重要標(biāo)志之一。硬盤的主軸馬達(dá)帶動(dòng)盤片高速旋轉(zhuǎn),產(chǎn)生浮力使磁頭飄浮在盤片上方。要將所要存取資料的扇區(qū)帶到磁頭下方,轉(zhuǎn)速越快,等待時(shí)間也就越短。因此,轉(zhuǎn)速在很大程度上決定了硬盤的速度。目前市場上常見的硬盤轉(zhuǎn)速一般有5400rpm、7200rpm和15000rpm。理論上,轉(zhuǎn)速越快越好,因?yàn)檩^高的轉(zhuǎn)速可縮短硬盤的平均尋道時(shí)間和實(shí)際讀寫時(shí)間。但是轉(zhuǎn)速越快發(fā)熱量越大,不利于散熱?,F(xiàn)在的主流硬盤轉(zhuǎn)速一般為15000rpm以上。 ● 平均尋道時(shí)間(Average Seek Time):指硬盤在盤面上移動(dòng)讀寫頭至指定磁道尋找相應(yīng)目標(biāo)數(shù)據(jù)所用的時(shí)間,它描述硬盤讀取數(shù)據(jù)的能力,單位為毫秒。當(dāng)單碟片容量增大時(shí),磁頭的尋道動(dòng)作和移動(dòng)距離減少,從而使平均尋道時(shí)間減少,加快硬盤速度?! ?平均延遲時(shí)間(Average Latency Time):指當(dāng)磁頭移動(dòng)到數(shù)據(jù)所在的磁道后,然后等待所要的數(shù)據(jù)塊繼續(xù)轉(zhuǎn)動(dòng)到磁頭下所用的時(shí)間。 ● 平均訪問時(shí)間(Average Access Time):指磁頭找到指定數(shù)據(jù)的平均時(shí)間,通常是平均尋道時(shí)間和平均延遲時(shí)間之和。平均訪問時(shí)間最能夠代表硬盤找到某一數(shù)據(jù)所用的時(shí)間,越短的平均訪問時(shí)間越好?! 槭裁匆v硬盤呢?因?yàn)镈B2數(shù)據(jù)庫在工作時(shí),一條SQL語句在經(jīng)過優(yōu)化器編譯時(shí),優(yōu)化器會讀取統(tǒng)計(jì)信息、數(shù)據(jù)庫配置參數(shù)和相關(guān)硬件信息來為該條SQL語句生成最優(yōu)的執(zhí)行計(jì)劃。其中的硬件信息包括表空間的transrate和overhead。這兩個(gè)參數(shù)的計(jì)算就是由硬盤的相關(guān)屬性來決定的。它們計(jì)算公式如下: transrate=(1/傳送速率)*1000/1024000*4096(假設(shè)用4KB頁大小) overhead=平均尋道時(shí)間+(((1/磁盤轉(zhuǎn)速)*60*1000)/2) 而平均尋道時(shí)間、磁盤旋轉(zhuǎn)速度和傳送速率是由硬盤本身決定的。所以我們必須做合理的存儲I/O設(shè)計(jì)以使優(yōu)化器更好地工作?! ?.1.2 磁盤陣列技術(shù) RAID的全稱是獨(dú)立磁盤冗余陣列(Redundant Array of Independent Disks)。它通過將多個(gè)相對比較便宜的磁盤組合起來,并相互連接,同時(shí)都連到一個(gè)或多個(gè)計(jì)算機(jī)上,以組成一個(gè)磁盤組,從而使其性能和容量達(dá)到或超過一個(gè)價(jià)格更昂貴的大型磁盤。20年來,RAID 推出了一系列級別,包括RAID 0、RAID 1、RAID 2、RAID 3、RAID4、RAID 5,以及各種組合如 RAID 1+0等,其中應(yīng)用最廣泛的是RAID5和RAID10?! AID 1+0 RAID-0能提供更好的性能,RAID-1能提供最佳的數(shù)據(jù)保護(hù)。如果把兩者結(jié)合在一起,就能同時(shí)提供高性能和數(shù)據(jù)保護(hù),但這也會同時(shí)提高磁盤陣列造價(jià)。 RAID-5 RAID-5不做全磁盤鏡像,但它會對每一個(gè)寫操作做奇偶校驗(yàn)計(jì)算并寫入奇偶校驗(yàn)數(shù)據(jù)。奇偶校驗(yàn)磁盤避免了像RAID-1那樣完全重復(fù)寫數(shù)據(jù)。當(dāng)一個(gè)磁盤失效,校驗(yàn)數(shù)據(jù)被用來重建數(shù)據(jù),從而保證系統(tǒng)不會崩潰。為避免磁盤瓶頸,奇偶校驗(yàn)和數(shù)據(jù)都會被分布到陣列中的各個(gè)磁盤。盡管讀的效率提高了,但是RAID-5需要為每個(gè)寫操作做奇偶校驗(yàn),因此它的寫的效率很差?! ?.1.3 存儲的Cache 高端存儲系統(tǒng)中除了要有高性能、高擴(kuò)展性的結(jié)構(gòu)外,Cache的設(shè)計(jì)將直接影響到存儲系統(tǒng)的性能表現(xiàn)和可靠性?! ache的主要作用是什么呢?作為緩存,Cache的作用具體體現(xiàn)在讀與寫兩個(gè)不同的方面:作為寫,一般存儲陣列只要求數(shù)據(jù)寫到Cache就算完成了寫操作,當(dāng)寫Cache的數(shù)據(jù)積累到一定程度,陣列才把數(shù)據(jù)刷到磁盤,這樣可以實(shí)現(xiàn)批量的寫入。所以,陣列的寫是非??焖俚?。至于Cache數(shù)據(jù)的保護(hù),一般都依賴于鏡像與電池(或者是UPS)?! ache在讀數(shù)據(jù)方面的作用同樣不可忽視,因?yàn)槿绻x取的數(shù)據(jù)能在Cache中命中的話,將大大減少磁盤尋道所需要的時(shí)間。因?yàn)榇疟P從開始尋道到找到數(shù)據(jù),一般都在6ms以上,而這個(gè)時(shí)間,對于那些密集型I/O的應(yīng)用可能不是太理想。但是,如果能在Cache保存的數(shù)據(jù)中命中,一般響應(yīng)時(shí)間則可以縮短在1ms以內(nèi)。存儲的Cache大小對整個(gè)I/O性能的影響是非常大的?! ?.1.4 IOPS IOPS,即I/O Per Second,也就是每秒進(jìn)行讀寫(I/O)操作的次數(shù),它是衡量存儲性能的一個(gè)重要指標(biāo)?! ?.1.5 網(wǎng)絡(luò)存儲技術(shù) FC SAN(Storage Area Network,存儲區(qū)域網(wǎng))是一個(gè)高速的子網(wǎng),這個(gè)子網(wǎng)中的設(shè)備可以從您的主網(wǎng)卸載流量。通常,SAN由RAID陣列連接光纖通道(Fibre Channel)組成,SAN同服務(wù)器和客戶機(jī)的數(shù)據(jù)通信是通過SCSI命令而非TCP/IP來實(shí)現(xiàn)的,數(shù)據(jù)處理是“塊級”(block level)。 SAN通過特定的互聯(lián)方式連接若干臺存儲服務(wù)器而組成一個(gè)單獨(dú)的數(shù)據(jù)網(wǎng)絡(luò),提供企業(yè)級的數(shù)據(jù)存儲服務(wù),如圖2-2所示。 SAN是一種特殊的高速網(wǎng)絡(luò),連接網(wǎng)絡(luò)服務(wù)器和諸如大磁盤陣列或備份磁帶庫的存儲設(shè)備,SAN置于LAN之下,而不涉及LAN。利用SAN,不僅可以提供大容量的存儲數(shù)據(jù),而且地域上可以分散,緩解了大量數(shù)據(jù)傳輸對局域網(wǎng)的影響。SAN的結(jié)構(gòu)允許任何服務(wù)器連接到任何存儲陣列,不管數(shù)據(jù)存放在哪里,服務(wù)器都可直接存取所需的數(shù)據(jù)?! D2-2 SAN存儲示意圖 NAS是Network Attached Storage(網(wǎng)絡(luò)附加存儲)的簡稱。在NAS存儲結(jié)構(gòu)中,存儲系統(tǒng)不再通過I/O總線附屬于某個(gè)服務(wù)器或客戶機(jī),而是直接通過網(wǎng)絡(luò)接口與網(wǎng)絡(luò)直接相連,由用戶通過網(wǎng)絡(luò)訪問。它是連接到一個(gè)計(jì)算機(jī)網(wǎng)絡(luò)的文件層的數(shù)據(jù)存儲,可以為不同網(wǎng)絡(luò)的客戶端提供數(shù)據(jù)存儲服務(wù)。NAS的硬件與傳統(tǒng)的專用文件服務(wù)器相似,它們的不同點(diǎn)在于軟件端。NAS中的操作系統(tǒng)和其他軟件只提供數(shù)據(jù)存儲、數(shù)據(jù)訪問功能,以及對這些功能的管理。與傳統(tǒng)以服務(wù)器為中心的存儲系統(tǒng)相比,數(shù)據(jù)不再通過服務(wù)器內(nèi)存轉(zhuǎn)發(fā),而是直接在客戶機(jī)和存儲設(shè)備間傳送,服務(wù)器僅起控制管理的作用。
圖書封面
圖書標(biāo)簽Tags
無
評論、評分、閱讀與下載
DB2數(shù)據(jù)庫性能調(diào)整和優(yōu)化 PDF格式下載