第二:SQL的優(yōu)化永遠(yuǎn)只針對(duì)大表之間的連接才用得上。不要懷疑,首先,我說的大表是指包含大表,不管是大表與大表,還是大表與小表
注:本文不是給你一個(gè)案例,而是講調(diào)優(yōu)的方法,古人云:授人魚不如授人漁,這里要講的,就是教你怎么捕魚。
這里要說的sql調(diào)優(yōu)很有意思,得先從感恩節(jié)說起。
感恩節(jié)(英語:Thanksgiving Day)是美國(guó)和加拿大共有的節(jié)日,由美國(guó)人民獨(dú)創(chuàng),原意是為了感謝上天賜予的好收成。11月的第四個(gè)星期四是感恩節(jié)。感恩節(jié)是美國(guó)人民獨(dú)創(chuàng)的一個(gè)古老節(jié)日,也是美國(guó)人合家歡聚的節(jié)日,因此美國(guó)人提起感恩節(jié)總是備感親切。感恩節(jié)是美國(guó)國(guó)定假日中最地道、最美國(guó)式的節(jié)日。
感恩節(jié)之后的第一天,是星期五,在這一天,美國(guó)人有瘋狂購物的習(xí)慣,所以被稱之為黑色星期五,近來己經(jīng)由傳統(tǒng)的商場(chǎng)購物改為網(wǎng)上購物,所以我的愕運(yùn)便由此而生,我的DB便在這一天被瘋狂購物給訪問爆了。
客戶提供了一份高峰時(shí)段的AWR報(bào)告,仔細(xì)分析后,發(fā)現(xiàn)竟然是一條高耗CPU的SQL給整跨了,僅僅一條,占了85%的CPU,這才深入去了解了SQL的優(yōu)化,以前也做過DB的一些優(yōu)化,基本上通過分析表、建索引、調(diào)參數(shù)、打PATCH等等都能解決,但這次,持續(xù)了一周,學(xué)了幾天,還沒解決。最終決定潛心研究SQL的優(yōu)化,得出以下幾點(diǎn)關(guān)于優(yōu)化的結(jié)論:
第 一:1/9原則,引用Oracle大牛Tom大師的原話:數(shù)據(jù)庫中90%的性能問題都可以由調(diào)整10%的SQL語句來解決。
Tom say: Sql tuning constitute a good 90 percent or more of the effort. Thats right; before we even get the DBAs involved, we the developers have done 90 percent of the work. This is why I think most people do not understand database tuning.
第二:SQL的優(yōu)化永遠(yuǎn)只針對(duì)大表之間的連接才用得上。不要懷疑,,首先,我說的大表是指包含大表,不管是大表與大表,還是大表與小表,只要是有大表就行,因?yàn)樾”砼c小表之間不會(huì)出現(xiàn)性能問題;其次:有連接才有優(yōu)化的價(jià)值,我真的不知道單表的SQL有什么優(yōu)化可言,對(duì)單表查詢無非是三點(diǎn):全表/索引/分區(qū)表,這三點(diǎn),你肯定會(huì)。
第 三:說第三條之間,先說明:正如前面兩條所言,數(shù)據(jù)庫90%的優(yōu)化在SQL,SQL的優(yōu)化關(guān)鍵在“大表連接”,所以下面說的SQL優(yōu)化都是指大表連接。
SQL的執(zhí)行中,Oracle提供的執(zhí)行計(jì)劃,不是什么神秘的東西,其實(shí)就是oracle去表中查找我們所需結(jié)果的一個(gè)算法,算法這東西太熟了,在大學(xué)《數(shù)據(jù)結(jié)構(gòu)》這門課中就學(xué)過(慚愧,這堂課從來都是去睡覺,因?yàn)楫?dāng)時(shí)根本不知道那位老朽在說什么),算法就是運(yùn)算過程,在這里,就是指查找路徑,說白了:執(zhí)行計(jì)劃=算法=查找路徑,要找最優(yōu)的執(zhí)行計(jì)劃,就是要找出最優(yōu)算法,最優(yōu)算法熟吧? 不熟我跟你說幾個(gè)名詞:"冒泡算法",“折中算法”,“快速查找”,去過軟件公司面試的人很多人肯定都做過這種題。而Oracle提供的執(zhí)行計(jì)劃中,恰恰就提供這些詳細(xì)的過程在里面。你能看到Oracle先去哪個(gè)表/索引拿數(shù)據(jù)、根據(jù)什么條件拿多少行,再把拿到的結(jié)果去連接哪個(gè)表、等等,經(jīng)過一系列的運(yùn)算,最后得出什么結(jié)果給你。
但是,ORACLE也是一款軟件,不是神,你給它一條SQL,它在開始運(yùn)算之前,是不知道哪種算法是最優(yōu)的,不可能每個(gè)都試一遍,再做比較吧,而且每條語句的執(zhí)行計(jì)劃上百種,每條語句都執(zhí)行上百次,那服務(wù)器干脆別活了。所以,它只能預(yù)估一種針對(duì)這條SQL認(rèn)為最優(yōu)的算法,然后去執(zhí)行。請(qǐng)注意:
1.永遠(yuǎn)沒有最優(yōu)算法,如果有最優(yōu)算法a,那優(yōu)化還需要做嗎?每次都按最優(yōu)算法a做行了。
2. Oracle認(rèn)為最優(yōu)的算法也不一定是最優(yōu)算法,如果是的話,我們還需要做嗎?
說到這里:我們就明白了,ORACLE調(diào)優(yōu)的90%=SQL調(diào)優(yōu)=大表連接調(diào)優(yōu)=執(zhí)行計(jì)劃調(diào)優(yōu)=算法調(diào)優(yōu),而大表連接就2點(diǎn):1.連接順序。2.連接算法(嵌套/哈希/合并)。
結(jié)論:SQL的調(diào)優(yōu)就是手動(dòng)設(shè)計(jì)出最優(yōu)連接順序和算法的執(zhí)行計(jì)劃。
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com