Oracle 12c 數(shù)據(jù)庫在優(yōu)化器方面確實(shí)做出了很大進(jìn)步。在 Oracle 12c 數(shù)據(jù)庫眾多特性中,自適應(yīng)查詢優(yōu)化是較大的功能變化了。它使優(yōu)化器能夠?qū)?zhí)行計(jì)劃進(jìn)行實(shí)時(shí)調(diào)整。當(dāng)現(xiàn)有的統(tǒng)計(jì)信息不足以產(chǎn)生一個(gè)優(yōu)化的計(jì)劃,它能夠及時(shí)的找到導(dǎo)致更佳的統(tǒng)計(jì)信息的額外信息。自適應(yīng)查詢優(yōu)化包括兩個(gè)方面:
創(chuàng)新互聯(lián)建站自成立以來,一直致力于為企業(yè)提供從網(wǎng)站策劃、網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、成都網(wǎng)站建設(shè)、電子商務(wù)、網(wǎng)站推廣、網(wǎng)站優(yōu)化到為企業(yè)提供個(gè)性化軟件開發(fā)等基于互聯(lián)網(wǎng)的全面整合營銷服務(wù)。公司擁有豐富的網(wǎng)站建設(shè)和互聯(lián)網(wǎng)應(yīng)用系統(tǒng)開發(fā)管理經(jīng)驗(yàn)、成熟的應(yīng)用系統(tǒng)解決方案、優(yōu)秀的網(wǎng)站開發(fā)工程師團(tuán)隊(duì)及專業(yè)的網(wǎng)站設(shè)計(jì)師團(tuán)隊(duì)。
自適應(yīng)計(jì)劃,它著重于改善一個(gè)查詢的初次執(zhí)行;
自適應(yīng)統(tǒng)計(jì)信息,它為后續(xù)的執(zhí)行提供了額外的信息。
( 自適應(yīng)查詢優(yōu)化功能的組件 )
以下對自適應(yīng)統(tǒng)計(jì)信息部分進(jìn)行總結(jié)介紹。
自適應(yīng)統(tǒng)計(jì)信息
在 oracle 中,優(yōu)化器所選擇的執(zhí)行計(jì)劃的質(zhì)量主要取決于可用的統(tǒng)計(jì)信息的質(zhì)量。然而,但有些查詢謂詞變得過于復(fù)雜導(dǎo)致無法單獨(dú)依賴于基表的統(tǒng)計(jì)信息,這就是為什么我們常常遇見一些復(fù)雜的 SQL 在統(tǒng)計(jì)信息沒有問題的情況下而仍會(huì)選擇較差的執(zhí)行計(jì)劃的原因,而現(xiàn)在在 oracle 12c 中優(yōu)化器能夠用自適應(yīng)統(tǒng)計(jì)信息來進(jìn)行增補(bǔ)。
自適應(yīng)統(tǒng)計(jì)信息主要包含三個(gè)方面:動(dòng)態(tài)采樣(動(dòng)態(tài)統(tǒng)計(jì)信息),自動(dòng)重優(yōu)化和 SQL 計(jì)劃指令。
1 、動(dòng)態(tài)統(tǒng)計(jì)信息
當(dāng)一個(gè) SQL 語句在執(zhí)行編譯時(shí), 統(tǒng)計(jì)信息缺失、過期或者不足時(shí), CBO 優(yōu)化器選擇的執(zhí)行計(jì)劃就有可能不是最優(yōu)的甚至是最差 的, 動(dòng) 態(tài)取樣正是為了補(bǔ)償不充足的統(tǒng)計(jì)信息,如果不這么做,這樣的信息可能導(dǎo)致非常糟糕的計(jì)劃。
一表的統(tǒng)計(jì)信息都缺失的情況下,優(yōu)化器會(huì)先在這些表上使用動(dòng)態(tài)取樣來收集基本的統(tǒng)計(jì)信息。這種情況下收集的統(tǒng)計(jì)信息在質(zhì)量和完整性上都不如使用 DBMS_STATS 包收集到的信息。數(shù)據(jù)庫中默認(rèn)動(dòng)態(tài)采樣的級(jí)別為 2 ,便是以上這種情況。
動(dòng)態(tài)采樣的級(jí)別
在 Oracle 12c 數(shù)據(jù)庫中 , 動(dòng)態(tài)取樣被進(jìn)行加強(qiáng)改造為動(dòng)態(tài)統(tǒng)計(jì)信息,動(dòng)態(tài)統(tǒng)計(jì)信息使優(yōu)化器在現(xiàn)有的統(tǒng)計(jì)信息上得到更加精準(zhǔn)的基數(shù)估算。這不僅僅是針對某個(gè)單表的訪問,而且也包括針對連接和分組計(jì)算。
初始化參數(shù) OPTIMIZER_DYNAMIC_SAMPLING 引入了新的取樣級(jí)別 11 。
11 級(jí)表示讓 oracle CBO 能夠自行決定是否為 SQL 語句選擇使用動(dòng)態(tài)統(tǒng)計(jì)信息,即使相關(guān)的表已存在統(tǒng)計(jì)信息。 CBO 是基于現(xiàn)有的統(tǒng)計(jì)信息, SQL 所用謂詞的復(fù)雜度以及預(yù)期的執(zhí)行時(shí)間來作出是否使用動(dòng)態(tài)統(tǒng)計(jì)信息的決定。
在以前, CBO 在某些情況下有時(shí)在生成執(zhí)行計(jì)劃時(shí)會(huì)只是做出猜測評估,而現(xiàn)在可以通過動(dòng)態(tài)統(tǒng)計(jì)信息的得到更精準(zhǔn)的計(jì)算。
動(dòng)態(tài)的統(tǒng)計(jì)信息讓執(zhí)行計(jì)劃的評估更加準(zhǔn)確,在沒有動(dòng)態(tài)采樣的情況下,優(yōu)化器只能通過猜測:
動(dòng)態(tài)統(tǒng)計(jì) 信息 最大的優(yōu)點(diǎn)是,在優(yōu)化器選擇執(zhí)行計(jì)劃時(shí),對統(tǒng)計(jì)信息缺失或者統(tǒng)計(jì)不夠準(zhǔn)確的對象,能夠動(dòng)態(tài)地收集統(tǒng)計(jì)信息,從而獲得相對好的執(zhí)行計(jì)劃, 并且 12c 中優(yōu)化器還能夠自行 將查詢的結(jié)果將會(huì)作為動(dòng)態(tài)統(tǒng)計(jì)信息保留在緩存中 ,供其他 SQL 來共享這些統(tǒng)計(jì)信息。
但是, 我們知道任何新功能都是一把雙刃劍,有優(yōu)點(diǎn)也有缺點(diǎn),對于動(dòng)態(tài)統(tǒng)計(jì)也一樣。 當(dāng)級(jí)別設(shè)置為 11 時(shí),動(dòng)態(tài)取樣啟用的頻率很可能超過以往。并且 使硬解析時(shí)候的解析時(shí)間可能變得更長,而且如果大量的動(dòng)態(tài)收集操作發(fā)生時(shí)可能影響到數(shù)據(jù)庫全體性能。
2 、自動(dòng)重優(yōu)化
自動(dòng)重優(yōu)化和之前所介紹的自適應(yīng)計(jì)劃不同的是,自適應(yīng)計(jì)劃是在初次執(zhí)行之前給出正確的執(zhí)行計(jì)劃,而自動(dòng)重優(yōu)化是在初次執(zhí)行之后,在以后的執(zhí)行中去修改執(zhí)行計(jì)劃。
在一個(gè) SQL 語句的初次執(zhí)行結(jié)束之時(shí), CBO 會(huì)利用初次執(zhí)行期間收集到的信息來決定是否需要自動(dòng)重優(yōu)化。如果執(zhí)行的結(jié)果和優(yōu)化器原有的估計(jì)值相差太大,則 CBO 會(huì)在下次執(zhí)行尋求替換的計(jì)劃。 CBO 會(huì)利用前一次執(zhí)行收集到的信息來幫助確定這個(gè)替換計(jì)劃。 CBO 可能將一個(gè)查詢重新優(yōu)化好幾次,每次都學(xué)習(xí)并且進(jìn)一步改善計(jì)劃。
Oracle 12c 數(shù)據(jù)庫只要有以下幾種重優(yōu)化的方式。
2.1 、統(tǒng)計(jì)信息反饋
統(tǒng)計(jì)信息反饋,它自動(dòng)為那些反復(fù)執(zhí)行的具有基數(shù)估算誤差的查詢改善計(jì)劃。在一個(gè) SQL 語句的首次執(zhí)行期間 CBO 生成執(zhí)行計(jì)劃時(shí)決定是否應(yīng)該為游標(biāo)啟動(dòng)統(tǒng)計(jì)信息反饋監(jiān)視器。
統(tǒng)計(jì)信息反饋在以下情況下被啟用:缺失統(tǒng)計(jì)信息的表,表上有多個(gè)合取或者析取謂詞 ( 指 AND 或者 OR 連接的謂詞 ), 謂詞包含有復(fù)雜操作,使得 CBO 不能準(zhǔn)確估算基數(shù)。
在查詢結(jié)束之時(shí), CBO 將它原來的基數(shù)估算和在執(zhí)行期間觀測到的實(shí)際基數(shù)進(jìn)行比較,如果估算值和實(shí)際值有較大的差異,它會(huì)將正確的值存儲(chǔ)起來供后續(xù)使用。如果查詢再次執(zhí)行,優(yōu)化器會(huì)使用糾正過的基數(shù)估算值,而不是它原先的估算值,來確定執(zhí)行計(jì)劃。如果它發(fā)現(xiàn)初始的估算值是正確的,則不會(huì)采取任何額外的措施。
以下通過例子來演示統(tǒng)計(jì)信息反饋:
可以看出首次生成的執(zhí)行計(jì)劃中 計(jì)算出的基數(shù)( E-Rows )與 實(shí)際 的基數(shù)( A-Rows )的因數(shù) 為 8 ( 63 : 500) ,這是存在差 誤 的 ,這說明這里執(zhí)行計(jì)劃還不是最準(zhǔn)確的。
在初次執(zhí)行之后,優(yōu)化器將它原來的基數(shù)估算和計(jì)劃中的操作實(shí)際返回的行數(shù)進(jìn)行比較。估計(jì)值和實(shí)際返回的行數(shù)有很大的差別,所以這個(gè)游標(biāo)被標(biāo)記為 IS_REOPTIMIZIBLE (可重優(yōu)化)并且不會(huì)被再次使用。 IS_REOPTIMIZIBLE 屬性指明這個(gè) SQL 語句應(yīng)該在下一次執(zhí)行的時(shí)候被硬解析,所以優(yōu)化器能夠使用在初次執(zhí)行時(shí)記錄下來的統(tǒng)計(jì)信息來確定一個(gè)更佳的執(zhí)行計(jì)劃。
在第二次執(zhí)行,優(yōu)化器使用了來自初次執(zhí)行的統(tǒng)計(jì)信息來確定一個(gè)具有不同連接順序的新計(jì)劃。在生成執(zhí)行計(jì)劃的過程中對統(tǒng)計(jì)信息反饋的使用情況被注明于執(zhí)行計(jì)劃下面的備注部分。
在第二次使用基數(shù)反饋后,新計(jì)劃沒有標(biāo)識(shí)為 IS_REOPTIMIZIBLE ,所以它將被這個(gè) SQL 語句的所有后續(xù)執(zhí)行所使用。之后,優(yōu)化器關(guān)閉了統(tǒng)計(jì)信息反饋的監(jiān)視。
2.2 、性能反饋
oracle 12 c 自動(dòng)重優(yōu)化的另一種形式為性能反饋,性能反饋主要是在自適應(yīng)模式下開啟自動(dòng)并行度選擇功能,從而改善重復(fù)執(zhí)行的 SQL 的效率 。
當(dāng)自動(dòng)并行度被啟用,在一個(gè) SQL 語句的首次執(zhí)行過程中,優(yōu)化器會(huì)決定語句是否應(yīng)該在并行模式下執(zhí)行;如果是,應(yīng)該使用什么并行度。在初次執(zhí)行結(jié)束時(shí),優(yōu)化器選擇的并行度,和根據(jù)語句初次執(zhí)行期間的實(shí)際性能統(tǒng)計(jì)信息(例如 CPU 時(shí)間)計(jì)算出來的并行度,被加以比較。 如果兩個(gè)值有顯著差別,那么語句被標(biāo)識(shí)為可重優(yōu)化, 初次執(zhí)行的性能統(tǒng)計(jì)信息被作為反饋存儲(chǔ)起來,以幫助為后續(xù)的執(zhí)行計(jì)算出一個(gè)更加合適的并行度。
Oracle 在 11gR2 引進(jìn)了 PARALLEL_DEGREE_POLICY 初始化參數(shù) 時(shí) 當(dāng)被設(shè)置為 AUTO 時(shí),能使并行度 選擇 自動(dòng)化。 該 參數(shù)默認(rèn)值為 MANUAL 。
Oracle 12cR1 為該參數(shù)增加了 ADAPTIVE 設(shè)置 , 該值類似于 AUTO , 但 包括了性能反饋。
在 PARALLEL_DEGREE_POLICY 調(diào)整為 ADAPTIVE 后,故意將一個(gè)并不需要那么大并行的語句開啟到 128 并行度。
第二次執(zhí)行時(shí)性能反饋機(jī)制已經(jīng)失效, CBO 自動(dòng)為該語句選擇并行度為 1 .
3 、 SQL 計(jì)劃指令
SQL 計(jì)劃指令是根據(jù)通過自動(dòng)重優(yōu)化學(xué)習(xí)到的信息所創(chuàng)建出來的。在 oracle 12C 的版本開始, oracle 推出了 sql 計(jì)劃指令( SQL Plan directives 簡稱 SPD )功能,保存為了以后生成最優(yōu)執(zhí)行計(jì)劃的一些指令和附加信息到字典表中,達(dá)到持久化的目的。 SQL 計(jì)劃指令針對 SQL 的一些額外的信息 , 優(yōu)化器可用來生成一個(gè)更優(yōu)的執(zhí)行計(jì)劃。
關(guān)于 SQL 計(jì)劃指令,我在文章中《 ORACLE 12C 優(yōu)化器的新利器 - SQL Plan Directives ( SQL 執(zhí)行計(jì)劃指令)介紹》已做詳細(xì)的介紹。
http://note.youdao.com/noteshare?id=c30735781a4f69041bcd3c62537cee98
4 、自適應(yīng)查詢優(yōu)化有關(guān)初始化參數(shù)
有幾個(gè)新的初始化參數(shù)可以管理 Oracle 12c 數(shù)據(jù)庫的優(yōu)化器及其新特性。下面是關(guān)于這些新參數(shù)的詳細(xì)介紹。
OPTIMIZER_ADAPTIVE_FEATURES
對于新的自適應(yīng)查詢優(yōu)化功能的使用,包括自適應(yīng)連接, SQL 計(jì)劃指令的創(chuàng)建和使用,是受 OPTIMIZER_ADAPTIVE_FEATURES 參數(shù)控制的。這個(gè)參數(shù)的缺省值和 OPTIMIZER_FEATURES_ENABLE(OFE) 相關(guān)。如果該參數(shù)被設(shè)置為 12.1.0.1 或者更高,那么 OPTIMIZER_ADAPTIVE_FEATURES 被設(shè)為 TRUE, 所有的自適應(yīng)查詢優(yōu)化功能將會(huì)啟用。如果 OFE 被設(shè)為比 12.1.0.1 更低,那么 OPTIMIZER_ADAPTIVE_FEATURES 將會(huì)被設(shè)為 FALSE, 所有的自適應(yīng)查詢優(yōu)化功能都不會(huì)啟用。
OPTIMIZER_ADAPTIVE_REPORTING_ONLY
在開啟自適應(yīng)查詢優(yōu)化后,執(zhí)行計(jì)劃的自適應(yīng)或者中途變動(dòng)會(huì)讓人擔(dān)心是否比較危險(xiǎn)。為了更好地理解多少 SQL 語句會(huì)受到新的自適應(yīng)計(jì)劃的影響,你可以將自適應(yīng)計(jì)劃開啟為只報(bào)告模式,方法是將 OPTIMIZER_ADAPTIVE_REPORTING_ONLY 設(shè)置為 TRUE( 缺省值是 FALSE) 。在這個(gè)模式下,啟用自適應(yīng)連接方法所需的信息被收集,但是不會(huì)有任何修改計(jì)劃的行動(dòng)。這意味著缺省的計(jì)劃總是會(huì)被使用,但計(jì)劃在非報(bào)告模式下會(huì)如何調(diào)整的信息也會(huì)被收集。
OPTIMIZER_DYNAMIC_SAMPLING
OPTIMIZER_DYNAMIC_SAMPLING 參數(shù)從 9i 就開始有了,在 12c 它有了新的級(jí)別 11, 這個(gè)級(jí)別控制動(dòng)態(tài)統(tǒng)計(jì)信息的生成。當(dāng)設(shè)置為級(jí)別 11 時(shí),優(yōu)化器會(huì)自動(dòng)確定哪些語句會(huì)受益于動(dòng)態(tài)統(tǒng)計(jì)信息,即使所有的對象已經(jīng)有了統(tǒng)計(jì)信息。
5 、自適應(yīng)查詢優(yōu)化的各種坑
還是那句話, 任何新功能都是一把雙刃劍 ,給我們帶來便利的同時(shí)會(huì)挖下不少坑來慢慢填。
結(jié)論
優(yōu)化器是 Oracle 數(shù)據(jù)庫最吸引人的部件之一,這是因?yàn)樗膹?fù)雜性。它的目的是為每個(gè) SQL 語句確定最高效的執(zhí)行計(jì)劃。在 oracle 12c 的優(yōu)化器自適應(yīng)查詢優(yōu)化的新特性中我們更可以看到 oracle 在優(yōu)化器的質(zhì)量追求上巨大努力。越來越智能的優(yōu)化器能減少更多的 SQL 性能問題,但是正因?yàn)閮?yōu)化器是個(gè)很復(fù)雜的組件,在初期總會(huì)遭遇各種隱患。因此在升級(jí)更新?lián)Q代之前更需要我們了解深入,防范于未然。
文章題目:ORACLE12C優(yōu)化器的一些新特性總結(jié)(二)
本文鏈接:http://www.rwnh.cn/article32/ggdopc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營銷型網(wǎng)站建設(shè)、定制網(wǎng)站、網(wǎng)站導(dǎo)航、網(wǎng)站策劃、微信小程序、關(guān)鍵詞優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)