DB2終極SQL性能調(diào)節(jié)技術(shù)經(jīng)典版
以下的文章主要向大家描述的是DB2終極SQL性能調(diào)節(jié)技術(shù),其中包括指針對(duì)于DB2數(shù)據(jù)庫(kù)性能的影響,DB2性能調(diào)節(jié)技術(shù)以及對(duì)更多未來(lái)的調(diào)節(jié)技術(shù)這些內(nèi)容的詳細(xì)描述,以下就是文章的主要內(nèi)容講述。
DB2,SQL,調(diào)優(yōu)
使用針對(duì)工作負(fù)載的正確的性能調(diào)節(jié)技術(shù),以避免硬件升級(jí)和優(yōu)化DB2性能
性能通過(guò)響應(yīng)時(shí)間,吞吐量,峰值響應(yīng)時(shí)間,命中和每秒會(huì)話(huà)來(lái)衡量。SQL編碼和調(diào)節(jié)技術(shù)直接影響性能。開(kāi)發(fā)高性能的DB2應(yīng)用需要對(duì)DB2技術(shù)的深入了解。
當(dāng)然在小數(shù)據(jù)量時(shí)這些技術(shù)無(wú)足輕重。忽略的連接,子查詢(xún),表的表達(dá)式和CASE表達(dá)式的程序完全可以在輕量級(jí)負(fù)載下工作的很好。使用100%的SELECT INFO語(yǔ)句來(lái)進(jìn)行數(shù)據(jù)獲取的程序,在開(kāi)始會(huì)非常的迅速。
但是一旦數(shù)據(jù)量和會(huì)話(huà)速度增加,性能將受到很大影響。DB2的可擴(kuò)展性需要小的,優(yōu)化的SQL加上方案設(shè)計(jì),性能結(jié)構(gòu),緩沖池,和針對(duì)工作負(fù)載模式優(yōu)化的存儲(chǔ)。另外的方案就是升級(jí)硬件了。當(dāng)然對(duì)于有著硬件升級(jí)的無(wú)盡預(yù)算的人來(lái)說(shuō),不用閱讀本文了。對(duì)于其他人,我將講解如何編碼聰明的SQL以及調(diào)優(yōu)的訪問(wèn)路徑。
指針對(duì)于DB2性能的影響
曾經(jīng)有段時(shí)間,在一個(gè)大的復(fù)雜的銀行應(yīng)用程序中存在著一個(gè)批處理程序。這個(gè)新的批處理程序和訪問(wèn)路徑被通過(guò)代碼走查的方式檢查過(guò)了。因?yàn)轫?xiàng)目截止日期的原因測(cè)試很少;在實(shí)際的首次運(yùn)行中,程序在運(yùn)行10個(gè)小時(shí)之后終止了。
一個(gè)很慢的代碼走查之后,發(fā)現(xiàn)了7個(gè)指針,每個(gè)指針訪問(wèn)一個(gè)不同的表中的數(shù)據(jù)。每個(gè)指針在其他打開(kāi)的指針的循環(huán)中被打開(kāi),在彼此間傳遞數(shù)據(jù)。也就是說(shuō),這個(gè)程序在DB2以外竟然結(jié)合了7個(gè)表。這不是聰明的SQL。這個(gè)信息需要進(jìn)入到7個(gè)表;然而,每個(gè)指針只能進(jìn)入一個(gè)。因此,7個(gè)指針被合并為一個(gè)聰明的指針:
- SELECT COL1, COL2, rest of the columns
- FROM ADDR A, NAME N, T3, T4, T5, T6, T7
- WHERE A.COL1 = N.COL9
- AND N.COL9 = T3.COL3
- AND T3.COL3 = T4.COL4
- AND T4.COL4 <> T5.COL5
- AND T4.COLX <> T5.COLY
- AND T5.COL6 = T6.COL6
- AND T6.COL6 = T7.COL7
- AND T6.CODE = :hv
這個(gè)批處理在第二天用了四分鐘就完成了。大多數(shù)人可能會(huì)結(jié)束這個(gè)成功的任務(wù)了,但是務(wù)實(shí)的人不會(huì)。一個(gè)緩慢的EXPLAIN信息走查發(fā)現(xiàn)了一個(gè)有趣的表連接序列問(wèn)題。優(yōu)化器選擇了開(kāi)始7個(gè)表的復(fù)雜的循環(huán)連接,還使用了一系列的大的數(shù)據(jù)表(ADDR和NAME),它們每個(gè)都包含5千萬(wàn)行數(shù)據(jù)。這不是DB2優(yōu)化器的典型行為。然而,有一些使用<>比較小表之間列的連接情況。
這些比較對(duì)于優(yōu)化器來(lái)說(shuō)很難估計(jì),因?yàn)镈B2 catalog包含了相等列而非不等列。這里就需要訪問(wèn)路徑優(yōu)化了。DB2優(yōu)化者腦中肯定有多種推薦的解決方案,一些可以在包或語(yǔ)句層次上,另外的一些工作在謂詞層次。當(dāng)然還有其他一些傳統(tǒng)方式不奏效情況下的DB2終極技術(shù)。
一個(gè)要求就是如下的性能調(diào)節(jié)技術(shù)提供給你的catalog以足夠的統(tǒng)計(jì),使用統(tǒng)計(jì)向?qū)?lái)保證優(yōu)化器有關(guān)于你的數(shù)據(jù)的精確全景。
DB2性能調(diào)節(jié)技術(shù)
包級(jí)別的SQL調(diào)優(yōu)——需要REOPT(ONCE/ALWAYS/AUTO) BIND選項(xiàng)。這個(gè)語(yǔ)句通告優(yōu)化器來(lái)在運(yùn)行時(shí)重新優(yōu)化包中的每個(gè)語(yǔ)句,至少ONCE,或者ALWAYS(每次執(zhí)行),在DB2 9中可以AUTO(需要時(shí))。這項(xiàng)技術(shù)的開(kāi)銷(xiāo)由選擇的選項(xiàng)和SQL語(yǔ)句的數(shù)量及復(fù)雜性決定。這些開(kāi)銷(xiāo)在批處理程序中可以忽略不計(jì),但是在短期運(yùn)行的交易中會(huì)有很大影響。在我們的例子中,批處理程序指針只有一個(gè)謂詞和一個(gè)基數(shù)為1的主機(jī)變量。REOPT是一個(gè)調(diào)節(jié)選項(xiàng),用來(lái)優(yōu)化非統(tǒng)一列值分布和主機(jī)變量?jī)?nèi)容高可變的情況,是COLCARDF=1的反面。包級(jí)別的調(diào)節(jié)并不合適。
語(yǔ)句級(jí)別的調(diào)節(jié)技術(shù)——包括OPTIMIZE FOR n ROWS和FETCH FIRST n ROWS ONLY。這些語(yǔ)句,放在SELECT語(yǔ)句末尾,是在不需要結(jié)果集的情況下進(jìn)行優(yōu)化的。優(yōu)化器假設(shè)除了這些語(yǔ)句的所有的SELECT語(yǔ)句需要整個(gè)結(jié)果,這些結(jié)果偏向于諸如數(shù)序和表預(yù)取的訪問(wèn)路徑。因?yàn)槲覀兊呐幚碇羔樢欢ㄐ枰麄€(gè)結(jié)果,因此語(yǔ)句級(jí)別的調(diào)節(jié)也不是合適的技術(shù)。
謂詞界別的調(diào)節(jié)技術(shù)——包括增加一個(gè)假的過(guò)濾器(TX.CX=TX.CX)或增加一個(gè)空操作到謂詞上(+0,-0,/1,*1, CONCAT ‘’)。一個(gè)假的過(guò)濾器能夠通過(guò)減少總過(guò)濾器因素(表中滿(mǎn)足資格的行的比例)改變優(yōu)化器。這個(gè)方法能夠改變表連接的順序,索引選擇和連接方法。多個(gè)假過(guò)濾器是允許的,但是必須在沒(méi)有引用過(guò)的一列上。
空操作(no op)能夠通過(guò)降級(jí)一個(gè)過(guò)濾器從符合到不符合來(lái)改變優(yōu)化器的工作方式,但是只在z/OS上有用,LUW優(yōu)化器卻不受其影響。這個(gè)改變也會(huì)影響一個(gè)表連接序列,索引選擇和連接方法。謂詞級(jí)別的技術(shù)可以被一起使用來(lái)獲取想要的結(jié)果。我們例子中的指針對(duì)多個(gè)謂詞級(jí)別調(diào)節(jié)的結(jié)合不起反應(yīng),因此是采用重武器的時(shí)候了。
一些終極調(diào)節(jié)技術(shù)包括使用DISTINCE的表的表達(dá)式和其他DB2終極跨查詢(xún)的塊優(yōu)化方法。這些技術(shù)要求手動(dòng)查詢(xún)重寫(xiě)。它們強(qiáng)制使得優(yōu)化器以一個(gè)指定順序的方式執(zhí)行查詢(xún)塊。使用這些技術(shù)視需要終極提醒的,因?yàn)樗麄兡馨驯磉B接序列,索引選擇和連接方法從好改到壞。DISTINCE表表達(dá)式強(qiáng)制優(yōu)化器優(yōu)先于其他查詢(xún)塊執(zhí)行圓括號(hào)中的查詢(xún)。
如果SELECT DISTINCE中指定的列引用了不同的表,表表達(dá)式可以被實(shí)例化為唯一的以供排序。我們的批處理指針有一個(gè)非優(yōu)化的連接序列,使用該技術(shù)得到如下查詢(xún):
- SELECT All columns needed FROM ADDR, NAME, (SELECT DISTINCT columns from tables 3 through 7
- FROM T3, T4, T5, T6, T7
- WHERE join conditions T3 through T7
- AND T6.CODE =:hv) AS TEMP
- WHERE join conditions for ADDR, NAME and TEMP
這樣的查詢(xún)重寫(xiě)迫使優(yōu)化器通過(guò)T7連接表T3來(lái)連接ADDR和NAME。如果關(guān)鍵字DISTINCT在上例中省略了,DB2優(yōu)化器合并表表達(dá)式查詢(xún)和輸出查詢(xún),這樣就和原來(lái)的語(yǔ)句和連接序列一樣了。
SELECT DISTINCT是一個(gè)關(guān)鍵的組件。然而,因?yàn)榱辛斜砜缭搅硕鄠€(gè)表,臨時(shí)的5個(gè)表連接結(jié)果實(shí)例為一個(gè)唯一的工作文件以供排序。排序的開(kāi)銷(xiāo)平均在每次執(zhí)行幾千行,這是可以忽略的負(fù)載。批處理程序現(xiàn)在可以在兩分鐘之內(nèi)完成任務(wù)了。
更多未來(lái)的調(diào)節(jié)技術(shù)
其他的一些查詢(xún)重寫(xiě)技術(shù)從全異的查詢(xún)塊中獲取信息,以重寫(xiě)查詢(xún)。IBM曾經(jīng)將此技術(shù)成為跨查詢(xún)塊優(yōu)化;DB2 9中被成為全局優(yōu)化。一個(gè)好消息就是這項(xiàng)技術(shù)開(kāi)始在DB2優(yōu)化器的自我查詢(xún)重寫(xiě)(QWR)階段中出現(xiàn)了。所有DB2查詢(xún)都能使用它也是指日可待了。同時(shí),我們也需要將一些DB2終極方法掌握在自己的手里。
【編輯推薦】
- DB2數(shù)據(jù)庫(kù)備份,恢復(fù)命令的操作經(jīng)驗(yàn)總結(jié)
- DB2恢復(fù)刪除表的實(shí)際操作技巧演示
- DB2 Online備份的操作方案“盛宴”
- DB2重定向恢復(fù)失敗“水到渠成”
- 使DB2數(shù)據(jù)庫(kù)備份和恢復(fù)的效率大大增加的秘訣