查看: 71187|回復: 23

[參考文檔] [翻譯]Oracle 12c R2優化器白皮書

[復制鏈接]
論壇徽章:
527
奧運會紀念徽章:壘球
日期:2008-09-15 01:28:12生肖徽章2007版:雞
日期:2008-11-17 23:40:58生肖徽章2007版:馬
日期:2008-11-18 05:09:48數據庫板塊每日發貼之星
日期:2008-11-29 01:01:02數據庫板塊每日發貼之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春紀念徽章
日期:2009-01-04 14:52:28數據庫板塊每日發貼之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食紀念
日期:2009-07-22 09:30:00
跳轉到指定樓層
1#
發表于 2017-3-2 10:37 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最后由 newkid 于 2017-3-3 09:13 編輯

原文鏈接:
http://www.oracle.com/technetwor ... edb-12c-1963236.pdf

第一版翻譯鏈接:http://www.3490925.live/thread-1855401-1-1.html


Oracle數據庫12c第二版優化器

Oracle白皮書 2016年11月

序言

優化器是Oracle數據庫最引人入勝的部件之一,因為它對每一個SQL語句的處理都必不可少。優化器為每個SQL語句確定最有效的執行計劃,這是基于給定的查詢的結構,可用的關于底層對象的統計信息,以及所有與優化器和執行相關的特性。

這份白皮書介紹了在Oracle數據庫12c第二版中與優化器和統計信息相關的所有新特性并且提供了簡單的,可再現的例子,使得你能夠更容易地熟悉它們,尤其是當你從早先的版本進行遷移的時候。它還概括了已有的功能是如何被增強以改善性能和易管理性。


有些Oracle優化器特性已經被從本文移除,并在它們自己的文章中被討論。具體來說,它們是:
  >>優化統計信息和優化統計信息顧問
  >>SQL計劃管理
  >>近似查詢處理

為了得知Oracle優化器的全貌,我們建議你結合參考文獻部分列出的相關文件來閱讀本文。詳細信息請參見第28頁。


自適應查詢優化

到目前為止,Oracle 12c數據庫中最大的變化是自適應查詢優化。自適應查詢優化是這樣的一組功能,它們使得優化器能夠對執行計劃進行實時調整,并且發現能夠導致更佳的統計信息的額外信息。當現有的統計信息不足以產生一個最佳的計劃,這種新方法是極其有用的。自適應查詢優化包括兩個方面:自適應計劃,它著重于改善一個查詢的執行;自適應統計信息,它利用額外的信息來改善查詢執行計劃。

(圖1:新的自適應查詢優化功能的構成組件)

Oracle數據庫12c第二版默認啟用的自適應功能與Oracle數據庫12c第一版不同。詳細信息請參見下面的“初始化參數”部分。

自適應計劃

優化器在某些條件下會選擇自適應計劃; 例如,當查詢包括連接和復雜謂詞,使得準確地估計基數變得很困難。自適應計劃使得優化器能夠把一個語句的計劃推遲到執行的時候才確定。優化器在它所選擇的計劃(缺省計劃)中植入統計收集器,從而在運行的時候,它能夠判斷基數估算與計劃的操作所實際看到的行數是否有很大的偏差。如果有顯著的區別,那么這個計劃或者計劃的一部分就會被自動調整,以避免不理想的性能。


自適應的連接方式

通過為計劃中的某些分支預先確定多個子計劃,優化器能夠實時調整連接方式。例如,在圖2中優化器的缺省計劃為orders(訂單)和 products(產品)表之間的連接選定的是嵌套循環連接,通過對products表的索引讀取。另一個可選的子計劃也同時被確定,它允許優化器將連接方式切換到哈希連接。在候選計劃中products是通過全表掃描來讀取的。

在初次執行的時候,統計收集器收集了關于這次執行的信息,并且將一部分進入到子計劃的數據行緩存起來。

優化器會確定要收集哪些統計信息,以及如何根據統計的不同值來確定計劃。它會算出一個“拐點”,兩個計劃選項在這個值是一樣好的。例如,如果當orders表的掃描產生的行數少于10行,則嵌套循環連接是最佳,當 orders 表的掃描產生的行數多于10行,則哈希連接是最佳,那么這兩個計劃的拐點就是10。優化器會算出這個值,并且配置一個緩存統計收集器,使得它緩存并且計數至10行為止。如果掃描產生了至少10行,那么連接方式就被確定為哈希連接;否則,它就被確定為嵌套循環連接。在圖2中,統計信息收集器正在監控和緩存來自orders表全掃描的數據行;趶慕y計信息收集器中看到的信息,優化器會決定使用哪個子計劃。在這個例子中,哈希連接被選中,因為來自orders表的行數大于優化器最初的估計。


(圖2:orders 和 products 表之間的連接的自適應執行計劃。左邊是缺省計劃,右邊是選中的計劃)

優化器能夠從嵌套連接切換到哈希連接,反之亦然?墒,如果初始選中的連接方法是排序合并連接,則自適應不會發生。

在缺省情況下,explain plan命令只會顯示優化器選定的初始(缺。┯媱。而DBMS_XPLAN.DISPLAY_CURSOR函數顯示的是查詢實際使用的計劃。

(圖3: Explain plan 和 DBMS_XPLAN.DISPLAY_CURSOR 為圖2所示的情形所輸出的計劃)

為了看到自適應計劃中所有的操作,包括統計收集器的位置,你必須在DBMS_XPLAN函數中指定額外的格式參數'adaptive'。在這個模式下,計劃的id欄會出現一個額外的“-”記號,指明在計劃中未被采用(非激活)的操作。

(圖4: 在DBMS_XPLAN.DISPLAY_CURSOR中使用'ADAPTIVE'格式參數得到的完整自適應計劃)

如果在“Plan”下拉框中選擇“Full”,SQL監控工具(SQL Monitor)將顯示所有的操作。計劃的非活動部分變灰(參見圖5)。如果點擊“Plan Note”圖標,一個彈出框會被顯示,確認該計劃是一個自適應計劃。

(圖5: SQL Monitor顯示一個自適應計劃)

自適應并行分配方法

當一個SQL語句以并行模式執行時,某些操作,例如排序,聚合和連接,它們要求在執行語句的并行服務進程之間重新分配數據。優化器所用的分配方法取決于操作方式,涉及到的并行服務進程數,以及預期的行數。如果優化器對行數估算不準確,那么選中的分配方法就可能不理想,并可能導致某些并行服務進程得不到充分利用。

隨著新的自適應分配方法"混合型哈希"(HYBRID HASH)的引入,優化器可以將分配方法延遲到執行的時候才確定,此時它對于涉及到的數據行數就有了更多的信息。一個統計收集器被插入到操作之前,如果緩存的數據的實際行數比閾值小,則分配方法將從哈希(HASH)切換到廣播(BROADCAST)。然而,如果緩沖的行數達到了閾值,則分配方法將會是哈希(HASH)。閾值的定義為并行度的兩倍。

圖6顯示了SQL監控工具中的一個執行計劃的例子,它是一個以并行模式執行的EMP和DEPT表之間的連接。一組并行服務進程(生產者,即粉紅色圖標)掃描兩個表并且將數據行送給另一組并行服務進程(消費者,即藍色圖標),該組進程是連接的真正執行者。優化器決定采用混合型哈希(HYBRID HASH)的分配方法。在這個連接中訪問的第一個表是DEPT表。來自DEPT表的數據行被緩存在統計收集器中,見計劃的第六行,直至閾值被超越,或者最后一行被獲取。在那時優化器將會決定采用何種分配方法。

(圖6: SQL監控工具中的一個EMP和DEPT表之間的連接的執行計劃,它使用了自適應分配方法)

要了解在運行時選擇哪個分配方法,查找此信息的最簡單方法是查看SQL監控工具中的OTHER列。 此列在PX SEND HYBRID HASH的行中顯示一個望遠鏡圖標。當你點擊這個圖標時,你可以看到運行時使用的分配方法。

(圖7: 混合型哈希分配法)

這個對話框中顯示的自適應分配方法有三種可能的值:6 = BROADCAST(廣播), 5 = ROUND-ROBIN(循環制),  16 = HASH(哈希)。


自適應位圖索引裁剪

當優化器生成了一個星型轉換計劃,它就必須選擇正確的位圖索引組合,以盡可能有效地減少相關的ROWID集合。如果有多個索引,其中的一些可能不會顯著地減少ROWID集合,但是仍然會在查詢執行期間引入可觀的處理成本。自適應計劃因此被用來裁剪索引,這些索引無法顯著地降低過濾匹配的行數。

在帶有adaptive關鍵字的SQL執行計劃中,DBMS_XPLAN.DISPLAY_CURSOR 將會顯示自適應的位圖裁剪,其方式類似于圖3所示的示例。例如,考慮以下SQL執行計劃,它顯示出位圖索引CAR_MODEL_IDX被裁剪掉:

(圖8: 自適應位圖索引裁剪的例子)

自適應統計信息

優化器所確定的執行計劃的質量取決于可用的統計信息的質量。然而,有些查詢謂詞變得過于復雜,以至于無法單獨依賴于基表的統計信息,而現在優化器能夠用自適應統計信息來進行增補。

動態統計信息

在一個SQL語句的編譯過程中,優化器會判斷已有的統計信息是否足以產生一個好的執行計劃,或者它該考慮使用動態取樣。動態取樣是為了補償缺失或者不充足的統計信息,如果不這么做,這樣的信息可能導致非常糟糕的計劃。在查詢中的一個或者多個表的統計信息都缺失的情況下,優化器在優化語句之前就會在這些表上使用動態取樣來收集基本的統計信息。這種情況下收集的統計信息在質量(因為是取樣)和完整性上都不如使用DBMS_STATS包收集到的信息。

從Oracle數據庫 12c第一版開始, 動態取樣被強化為動態統計信息。動態統計信息允許優化器強化現有的統計信息以獲取更加精確的基數估算,不僅僅是為單表的訪問,而且也包含連接和分組(GROUP BY)謂詞。并且,從Oracle數據庫12c第一版開始, 初始化參數OPTIMIZER_DYNAMIC_SAMPLING引入了新的取樣級別11。11級使得優化器能夠自動為任何SQL語句使用動態統計信息,即使所有基本的表統計信息都已經存在。優化器做出使用動態統計的決定,是基于所用謂詞的復雜性,和已經存在的基礎統計信息,以及預期的SQL語句總執行時間。例如,之前的優化器在某些情況下會使用猜測的方法,比如帶有LIKE謂詞和模糊匹配的查詢,而現在則會啟用動態統計信息。

缺省的動態取樣級別是2, 因此,當級別設置為11時,動態取樣啟用的頻率很可能大大超過以往。這會增加語句的解析時間。為了將對性能的影響減到最低,在Oracle數據庫12c第一版中,動態取樣查詢的結果將會被保留在數據庫的服務器結果緩存,從Oracle數據庫12c第二版開始會保留在SQL計劃指令的知識庫中。這就允許多個SQL語句來共享一組由動態取樣收集的統計信息。下面將要更詳細討論的SQL計劃指令也會利用這種級別的動態取樣。

自動重優化

在一個SQL語句的首次執行期間,一個執行計劃如常被生成。在優化的過程中,有些已知的低質量估算種類(例如,對缺少統計信息的表的估算,或者帶有復雜謂詞的表的估算)會被做記號,對產生的游標的監控會被開啟。如果系統開啟了對一個游標的反饋監控,計劃中的基數估算就被用來與執行過程中看到的實際基數進行比較。如果估算值被發現和實際基數有顯著區別,則優化器會在下次執行尋求可替換的計劃。優化器會利用前一次執行收集到的信息來幫助確定這個替換計劃。優化器可能將一個查詢重新優化好幾次,每次都學習并且進一步改善計劃。Oracle 12c數據庫支持多種不同形式的重優化。

統計信息反饋

統計信息反饋(以前稱為基數反饋,cardinality feedback)是重優化的一種形式,它自動為那些反復執行的具有基數估算誤差的查詢改善計劃。在一個SQL語句的首次執行期間,優化器生成了一個執行計劃,并且決定是否應該為游標啟動統計信息反饋監控器。統計信息反饋在如下的情形被啟用:缺失統計信息的表,表上有多個合取或者析取謂詞(指用AND或者OR連接起的謂詞), 謂詞包含有復雜操作,使得優化器不能準確估算基數。

在查詢結束之時,優化器將它原來的基數估算和在執行期間觀測到的實際基數進行比較,如果估算值和實際值有顯著差異,它會將正確的值存儲起來供后續使用。它還會創建一個SQL計劃指令,使得其他的SQL語句也能受益于這次初始執行中學到的信息。如果查詢再次執行,優化器會使用糾正過的基數估算值,而不是它原先的估算值,來確定執行計劃。如果它發現初始的估算值是正確的,則不會采取任何額外的措施。在第一次執行之后,優化器關閉了統計信息反饋的監控。

圖9顯示了一個SQL語句受益于統計信息反饋的例子。在這個兩表連接的初次執行中,由于customers表上有多個相關的單列謂詞,優化器將基數低估了8倍。

(圖9: 一個受益于自動重優化的統計信息反饋的SQL語句初次執行的情況)

當估計值和實際返回的行數有很大的差別,這個游標被標記為IS_REOPTIMIZIBLE(可重優化)并且不會被再次使用。IS_REOPTIMIZIBLE屬性指明這個SQL語句應該在下一次執行的時候被硬解析,所以優化器能夠使用在初次執行時記錄下來的統計信息來確定一個更佳的執行計劃。

(圖10: 在初次執行的統計信息與原有的基數估算有顯著差異之后,游標被標識為可重優化)

一個SQL計劃指令同樣被創建,這是為了確保下次如果在customers表使用了相似的謂詞的SQL語句被執行,優化器會注意到這些列之間的相關性。

在第二次執行,優化器使用了來自初次執行的統計信息來確定一個具有不同連接順序的新計劃。在生成執行計劃的過程中對統計信息反饋的使用情況被注明于執行計劃下面的備注部分。

(圖11: 新生成的計劃使用來自初次執行的統計信息)

新計劃沒有標識為IS_REOPTIMIZIBLE,所以它將被這個SQL語句的所有后續執行所使用。

(圖12: 新生成的計劃標識為不可重優化)

性能反饋
重優化的另一種形式為性能反饋,當自動并行度(AutoDOP)在自適應模式下被啟用,這會有助于改善重復執行的SQL語句的并行度的選擇(參見第25頁上的OPTIMIZER_ADAPTIVE_STATISTICS內容)。

(注:關于自動并行度請參見參考文章5 “Oracle數據庫12c并行執行基礎知識”)

當自動并行度(AutoDOP)在自適應模式下被啟用,在一個SQL語句的首次執行過程中,優化器會決定語句是否應該在并行模式下執行;如果是,應該使用哪種并行度。并行度的選擇是基于語句的預計性能表現。對于優化器決定并行執行的任何SQL語句,額外的性能監視器同樣在初次執行的時候被打開,

在初次執行結束時,優化器選擇的并行度,和根據語句初次執行期間的實際性能統計信息(例如CPU時間)計算出來的并行度,被加以比較。如果兩個值有顯著差別,那么語句被標識為可重優化,初次執行的性能統計信息被作為反饋存儲起來,以幫助為后續的執行計算出一個更加合適的并行度。

如果性能反饋被用于一個SQL語句,它會在計劃下方的備注部分被注明,如圖13所示。


(圖13: 一個SQL語句的執行計劃,性能反饋發現它串行執行會更好)


論壇徽章:
527
奧運會紀念徽章:壘球
日期:2008-09-15 01:28:12生肖徽章2007版:雞
日期:2008-11-17 23:40:58生肖徽章2007版:馬
日期:2008-11-18 05:09:48數據庫板塊每日發貼之星
日期:2008-11-29 01:01:02數據庫板塊每日發貼之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春紀念徽章
日期:2009-01-04 14:52:28數據庫板塊每日發貼之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食紀念
日期:2009-07-22 09:30:00
2#
 樓主| 發表于 2017-3-2 10:42 | 只看該作者
本帖最后由 newkid 于 2017-3-2 10:55 編輯

SQL計劃指令

SQL計劃指令是根據通過自動重優化學習到的信息所創建出來的。一個SQL計劃指令是一些額外的信息, 優化器可用來生成一個更優的執行計劃。例如,當發生連接的兩個表在連接列有傾斜數據,SQL計劃指令可以指引優化器使用動態統計信息來獲得更加精確的連接基數估算。

SQL計劃指令是在查詢表達式之上創建的,而非語句級或者對象級,這樣就可確保它們可被應用于多個SQL語句。在一個SQL語句上有多個SQL計劃指令也是可能發生的。一個SQL語句所使用的SQL計劃指令數目被顯示于執行計劃下方的備注部分(圖14)。

(圖14: 一個語句所使用的SQL計劃指令數目被顯示于執行計劃下方的備注部分)

數據庫自動維護SQL計劃指令,并把它們存儲在SYSAUX表空間。任何未被使用的SQL計劃指令在53周之后會被自動清除。SQL計劃指令也可以通過DBMS_SPD包手動管理(修改或刪除),然而,你不可能手動創建一個SQL計劃指令。SQL計劃指令可以通過視圖DBA_SQL_PLAN_DIRECTIVES和DBA_SQL_PLAN_DIR_OBJECTS進行監控(見圖15)。


(圖15: 查看根據通過自動重優化學習到的信息所創建出來的SQL計劃指令)

總共有兩種類型的SQL計劃指令行:DYNAMIC_SAMPLING(動態取樣) 和 DYNAMIC_SAMPLING_RESULT(動態取樣結果)!皠討B取樣”類型會告訴優化器,如果看到了這個特定的查詢表達式(例如,在country_id, cust_city, 和 cust_state_province上一起使用的過濾謂詞),它就應該使用動態取樣來糾正基數估算的偏差。

“動態取樣結果”這種類型是在Oracle數據庫12c第二版開始才有的,它指明了動態取樣查詢的結果是保存在SQL指令知識庫中(而非Oracle數據庫12c第一版所使用的服務器結果緩存)!



(圖16: 保存在SQL指令知識庫中的動態取樣結果,始于Oracle數據庫12c第二版)

SQL計劃指令同樣被ORACLE用來確定擴展統計信息(特別是列群組)是否缺失,是否能夠糾正基數估算偏差。一個SQL指令被使用之后,優化器會決定基數估算偏差是否能夠用列群組解決。如果是這樣的話,它會在下一次收集表統計信息的時候自動創建那個列群組。這個步驟在在Oracle數據庫12c第一版中是“始終開啟”的,但是從Oracle數據庫12c第二版開始,它是通過DBMS_STATS的AUTO_STAT_EXTENSIONS選項進行控制。注意缺省的設置是OFF,所以為了開啟自動列群組的創建,你必須執行下列步驟:
EXEC DBMS_STATS.SET_GLOBAL_PREFS('AUTO_STAT_EXTENSIONS', 'ON')

于是如果可能的話,擴展信息就會取代SQL計劃指令被使用在SQL計劃中(等值謂詞,group by分組等等)。如果SQL計劃指令已經沒必要存在,它會在53周后被自動清除。
(注:關于擴展統計信息的更多信息可見參考文章1“了解Oracle數據庫12c的優化器統計信息”)


優化器統計信息

優化器統計信息是描述數據庫以及里面的對象的數據的集合。優化器利用這些統計信息來為每個SQL語句選擇最佳的執行計劃。對于任何一個Oracle系統,為了把性能維持在一個可接受的水平,及時收集適當的統計信息是至關重要的。隨著每個新版本的發布,Oracle一直致力于自動提供必要的統計信息。

此處提供的僅是摘要,完整的詳細信息請見參考文章1,“了解Oracle數據庫12c第二版的優化器統計信息”。

新型的直方圖

直方圖告訴優化器,數據在一個列中是如何分布的。在缺省情況下,優化器假定在一個列中,數據行是跨越不同的值均勻分布的, 在帶有等值謂詞查詢中,基數的計算方法是將總行數除以等值謂詞所用到的列中的不同值的個數。直方圖的存在改變了優化器用來確定基數估算的公式,并且允許它生成更精確的估算值。從Oracle 12c第一版開始,多了兩種額外的直方圖,即頂級頻度直方圖和混合直方圖。它們允許優化器對更為棘手的數據傾斜情形推導出改良的基數估算。在Oracle 12c之前,有兩種類型的直方圖:頻度和等高直方圖。


統計信息在線收集

當一個索引被創建,Oracle將自動收集優化器統計信息作為索引創建任務的一部分, 在創建索引所必需的全表掃描以及排序之上,順便加上統計信息的收集(這從Oracle 9i以來就有了)。從Oracle數據庫12c第一版開始,同樣的技術也被應用于直接路徑操作,例如create table as select (CTAS)和對空表的insert as select(IAS)操作。將統計信息收集搭載為數據加載操作的一部分,意味著在數據加載結束之后,不需要額外的全表掃描就可以立即擁有統計信息。


增量統計信息

在分區表上收集統計信息,包括在表級(全局統計信息)和分區(子分區)級別的收集。如果表分區(或子分區)的數據有任何變動,或者分區被添加或移除,那么全局級別的統計信息就必須被修改,以體現出這種變化,使得分區級別以及全局級別的統計信息之間有對應關系。對于大的分區表,掃描整個表來重構精確的全局級別統計信息可能是非常昂貴的。因此,Oracle數據庫11g引入了增量統計信息來解決此問題,從而為表中的每個分區創建了綱要(synopses)。這些數據結構可以被用來推導出全局級別的統計信息——包括不可聚合的統計信息,例如列的基數——而無需掃描整個表。


增量統計信息及其陳化(staleness)

在Oracle 11g數據庫中,如果一張表的增量統計被打開,當其中的一個分區的一行數據被修改時,那個分區的統計信息就被認為已經過于陳舊,必需被重新收集才能用于生成全局級別的統計信息。
在Oracle 12c數據庫中,一個稱為INCREMENTAL_STALENESS的新屬性允許你控制分區統計信息何時被認為已陳化,并且不能勝任生成全局統計信息。在缺省情況下,INCREMENTAL_STALENESS被設為NULL, 這意味著一旦有一行數據被修改,分區級統計就被認為已陳化(和11g相同)。

或者,它也可被設置為USE_STALE_PERCENT 或 USE_LOCKED_STATS。USE_STALE_PERCENT的意思是,在相應的分區或子分區中,只要被修改行數的百分比低于STALE_PRECENTAGE屬性的值(缺省是10%),分區級統計就會被使用。USE_LOCKED_STATS的意思是如果一個分區上的統計信息被鎖定,就會被用于生成全局統計信息,不管這個分區中自從上次收集以來有多少行數據被修改。

增量統計信息以及分區交換加載

分區的好處之一是可以通過分區交換命令輕易地、迅速地加載數據,對業務用戶造成最小的影響。分區交換命令允許一張非分區表中的數據被切換到分區表的指定分區中。這個命令并不會物理地移動數據;相反,它只是修改了數據字典,將指針從分區交換到表上,反之亦然。

在以前的版本中,在分區交換的操作過程中,你無法在非分區表上生成必要的統計信息來支持增量統計信息。相反,統計信息只有在交換發生后才能被收集,這是為了確保全局統計信息能夠被增量維護。

在Oracle 12c數據庫中,必要的統計信息(綱要)可以在非分區表上創建,從而使得在分區交換中被交換的統計信息能夠自動被用于增量維護全局統計信息。

更加緊湊的綱要

使用增量統計信息來收集統計信息的性能好處,可能會伴隨著綱要所消耗的更高的磁盤存儲空間的代價(它們存儲在SYSAUX表空間中)。對于具有大量分區和大量列的表,存儲空間需求就更高,特別是在不同值(NDV)的數量較多的情況下。除了消耗存儲空間,維護非常大的摘要的性能開銷也可能變得很可觀。 Oracle 數據庫12c第二版引入了一種用于收集和存儲NDV信息的新算法,這導致綱要縮小了很多,同時保持與先前算法類似的精度水平。

并發統計信息
在Oracle 11g數據庫中,統計信息的并發收集被引入。當全局統計信息的收集屬性CONCURRENT被設置,Oracle會利用作業調度器和高級隊列部件來為每一個對象(表或者分區)創建和管理一個并發的作業。

在Oracle 12c數據庫中,統計信息的并發收集被強化以更好地利用每個調度的作業。如果一個表,或分區,或者子分區很小或者是空的,數據庫可能自動將這個對象以及其他的小對象整批放進一個單獨的作業來降低作業維護的開銷。


列群組的自動偵測
擴展統計信息是在Oracle 11g中被引入的。它們有助于優化器改善SQL語句的基數估算的精確性,如果這個語句涉及到包含函數的列(例如UPPER(LastName)),或者在過濾謂詞、連接條件、分組鍵中用到的來自同一個表的多個列。雖然擴展統計信息極其有用,但要得知何種擴展信息應該被創建是很困難的,如果你對應用或者數據集不熟悉的話。

列群組的自動偵測,會自動根據給定的工作負載確定一張表上需要哪些列群組。列群組的自動偵測是一個簡單的三步驟的過程。
(關于列群組的創建請參見“了解Oracle數據庫12c的優化器統計信息”白皮書)


DBMS_STATS包中的新的報告子程序

對于任何一個系統,為了維持一個可接受的性能水平,知道何時收集、如何收集及時的統計信息是至關重要的。想要確定一個環境中正在執行的是什么樣的統計信息收集操作,對統計方法的變動將會如何影響系統,這可能是一項困難且耗時的任務。

在Oracle 12c數據庫中, 新的報告子程序被加入到DBMS_STATS包中,使得我們更易于監控何種統計收集活動正在進行,以及對這些操作的參數進行修改會有什么影響。這些DBMS_STATS 子程序是REPORT_STATS_OPERATIONS, REPORT_SINGLE_STATS_OPERATION 和 REPORT_GATHER_*_STATS。

圖17演示了一個來自REPORT_STATS_OPERATIONS函數的輸出例子。報告顯示出詳細的信息,在一個指定的時間窗口發生了哪些統計信息收集操作。它給出了詳細信息,關于每個操作合適發生,狀態如何,覆蓋了多少個對象,這可以用文本或者HTML格式顯示。

(圖17: 統計信息操作的報告)

優化器統計信息顧問

眾所周知,劣質統計會導致查詢性能問題。 識別陳舊的、過時的統計信息和缺失的統計信息相對比較容易,但低質量的統計信息可能就難以識別:例如表和索引之間的不一致,主鍵/外鍵關系等等。

統計信息中的不一致通常是不遵循推薦方法的結果,但要嚴格遵守這些方法有時候也不容易,原因有多種。 例如,Oracle不斷增強統計信息收集功能,但升級后這些增強功能可能會被忽視(一個很好的示例是關于使用AUTO_SAMPLE_SIZE而非固定百分比的建議)。 DBA可能使用舊腳本手動收集統計信息,不愿意更改“已被證明”的過程。 有時,統計信息收集可能被忽視,在批處理期間可能得不到維護,并且在批處理窗口中可能會令人感覺時間不足。 還有許多“繼承”下來的系統,沒有人能理解用于維護統計信息的腳本。

為了解決這些問題,Oracle 數據庫 12.2含有一個叫做優化器統計信息顧問(Optimizer Statistics Advisor)的新功能。 顧問的目標是分析如何收集統計信息,檢驗已收集的統計信息的質量,并檢查自動統計信息收集的狀態(例如,檢查是否成功完成)。為了實現這一點,它根據一套規則對數據字典進行檢查。 如果它發現違反規則的例外情況,可能會生成調查結果,而這些調查結果可能隨之導致具體的建議。 顧問將會生成一份報告,列出調查結果(伴隨相應的“被違反”的規則),然后列出具體建議以糾正這種情況。 最后,這些建議可以使用一組操作來實現。 操作可以采用SQL腳本的方式輸出,也可以自動被實施。




完整的詳細信息請見參考文章2, "Oracle 12c數據庫優化器統計信息收集的最佳實踐"


新增的以及強化的優化技術

在查詢優化的過程中,Oracle會使用一系列復雜的技術對SQL語句進行變換。查詢優化的這個階段的目標是為了將原來的SQL語句變換為一個語義上等價、但是處理起來更加高效的SQL語句。Oracle 12c數據庫引入了幾種新的查詢優化方法。


從Oracle 數據庫12c第一版開始有的:

部分連接取值

部分連接取值是這樣一種優化技術,它是在連接順序的生成過程中被使用的。這種技術的目標是為了避免產生重復的行,如果不用這種技術,這些重復只能在計劃中隨后用一個DISTINCT操作符來去除。通過在計劃中早些用一個內連接(INNER JOIN)或者半連接(SEMI-JOIN)來取代DISTINCT操作符,這一步驟產生的行數將會減少。這應該會使得計劃的總體性能得到改善,因為隨后的步驟只需在縮小的行的集合上進行操作。這種優化可以應用在如下類型的查詢塊:MAX(),MIN(), SUM(DISTINCT), AVG (DISTINCT), COUNT (DISTINCT), DISTINCT, 以及UNION, MINUS, INTERSECT 操作符的分支, [NOT] EXISTS 子查詢等等。

考慮如下的DISTINCT查詢:

SELECT DISTINCT order_id
  FROM orders o, customers c
WHERE o.customer_id = c.customer_id
       AND order_id < 2400;

(譯者注:這個例子舉得不好。order_id在orders中應該是唯一的,customer_id在customers表中也應該是唯一的,所以連接之后order_id在結果中也應該是唯一的,DISTINCT完全多余)

在Oracle 11g數據庫中,ORDERSh CUSTOMERS之間的連接是一個哈希連接(HASH JOIN),必須在去除重復行的排序發生前被完全取值。

(圖18: Oracle 11g數據庫的計劃要求在ORDERS 和 CUSTOMERS之間的全連接,然后用unique sort去除重復)

有了部分連接取值,ORDERS 和 CUSTOMERS之間的連接被轉換為一個半連接,這意味著一旦在CUSTOMERS表中找到一個匹配的CUSTOMER_ID,查詢就會轉移到下一個CUSTOMER_ID。通過將哈希連接轉換為半連接,流入HASH UNIQUE 的行數大大減少,因為相同連接鍵的重復行已經被去除了。變換過的SQL的計劃如圖19所示。

(圖19: Oracle 12c數據庫的計劃顯示了ORDERS 和 CUSTOMERS之間的半連接,沒有產生重復的行)

接受空值的半連接

應用開發者在包含EXISTS子查詢的SQL語句中加入IS NULL謂詞是不罕見的。加入額外的IS NULL謂詞是因為 EXISTS子查詢產生的半連接結果會去除具有空值的行,正如內連接(INNER JOIN)所做的一樣?紤]如下的查詢:

SELECT p.prod_id,s.quantity_sold,s.cust_id
  FROM products p, sales s
WHERE p.prod_list_price > 11
        AND p.prod_id = s.prod_id
        AND (s.cust_id IS NULL
             OR EXISTS (SELECT 1
                          FROM customers c
                         WHERE c.cust_id = s.cust_id
                               AND c.country_id = 'US'
                        )
            );

這里的假定是在s.cust_id 列上可能有空值,而我們想要返回那些行。在Oracle 12c數據庫之前,EXISTS子查詢無法被展開,因為它出現在一個帶有IS NULL謂詞的OR謂詞(析取謂詞)中。因為子查詢無法被展開,導致不理想的計劃被產生,子查詢被作為過濾操作應用在SALES和PRODUCTS表的連接之后。

(圖20: Oracle 11g數據庫的計劃顯示EXISTS 自查詢被作為過濾操作應用于連接之后)

在Oracle 12c數據庫中,一種新型的半連接被引入,稱為接受空值的半連接。這種新連接擴展了半連接的算法,在連接的左邊的表的連接列上檢查空值。在這個例子中檢查會發生在s.cust_id。如果列包含空值,那么相應的SALES表上的行被返回,否則半連接被執行以確定該行是否滿足連接條件。接受空值的半連接計劃如下圖21所示。

(圖21: Oracle 12c數據庫的計劃顯示 EXISTS子查詢被展開,在customers和sales之間使用了接受空值的半連接)

使用道具 舉報

回復
論壇徽章:
527
奧運會紀念徽章:壘球
日期:2008-09-15 01:28:12生肖徽章2007版:雞
日期:2008-11-17 23:40:58生肖徽章2007版:馬
日期:2008-11-18 05:09:48數據庫板塊每日發貼之星
日期:2008-11-29 01:01:02數據庫板塊每日發貼之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春紀念徽章
日期:2009-01-04 14:52:28數據庫板塊每日發貼之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食紀念
日期:2009-07-22 09:30:00
3#
 樓主| 發表于 2017-3-2 10:42 | 只看該作者
本帖最后由 newkid 于 2017-3-2 10:54 編輯

標量子查詢的展開

標量子查詢是出現在SQL語句的SELECT子句的子查詢。因為標量子查詢不能被展開,所以一個相關的標量子查詢(它引用了子查詢之外的列)必須為外層查詢產生的每一行被取值?紤]下面的查詢:

SELECT c.cust_id, c.cust_last_name, c.cust_city,
      (SELECT avg(s.quantity_sold)
         FROM sales s
        WHERE s.cust_id = c.cust_id) avg_quan
FROM customers c
WHERE c.cust_credit_limit > 50000;

在Oracle 11g數據庫中,對于CUSTOMERS 表中 CUST_CREDIT_LIMIT大于50000的每一行,在sales表上的標量子查詢都必須被執行。SALES表是大表,把它掃描多次是非常耗費資源的。

(圖22: Oracle 11g數據庫的計劃顯示,對于customers表返回的每一行,標量子查詢都必須被取值)

將標量子查詢展開并且將其轉換為一個連接,就免除了為外層查詢的每一行都進行求值的必要性。在Oracle 12c數據庫中,標量子查詢能夠被展開,在這個例子中,SALES表上的標量子查詢被轉換成一個group-by視圖。group-by視圖確定會返回每組一行,正如標量子查詢一樣。查詢中同樣加入了一個外連接,這是為了確保即使當視圖的結果為空時,CUSTOMERS的數據仍然會被返回。轉換后的查詢如下:

SELECT c.cust_id, c.cust_last_name, c.cust_city, v.avg_quan
FROM customers c,
      (SELECT avg(s.quantity_sold) avg_quan, s.cust_id
         FROM sales s
       GROUP BY s.cust_id) v
WHERE c.cust_credit_limit > 50000
      AND c.cust_id = v.cust_id(+);

(圖23: Oracle 12c數據庫的計劃顯示標量子查詢已經被展開成外連接和GROUP BY視圖)

多表左外連接
在Oracle 12c數據庫之前,如果在外連接的左邊有多個表是不合法的,會導致ORA-01417錯誤。


(圖24: Oracle 11g數據庫不支持多表左外連接)
執行這樣一個查詢的方法是將其翻譯為ANSI語法?墒,實現這樣的ANSI語法會導致一個橫向視圖被使用。Oracle無法合并橫向視圖,所以優化器的計劃在連接順序和連接方法上的選擇就受到了限制,這可能導致不理想的計劃。
(注:橫向視圖指的是這樣的視圖:它引用了不在視圖中的表的列)



(圖25. ANSI 語法導致帶有橫向視圖的計劃,它無法被合并,因此限制了連接順序)

在Oracle 12c數據庫中,用Oracle的(+)指定的多表左外連接現已被支持。一個外連接的左邊的多表視圖也能夠被合并。能夠合并視圖就能允許更多的連接順序和連接方法被考慮,結果是更優的計劃會被選中。

(圖26. 對新的多表作連接的支持允許視圖合并,并且會導致更優的計劃)

分組和聚合消除

許多應用程序包含具有以下形式的查詢:一個group-by查詢塊具有單個表,這個表又是個group-by視圖。在某些條件下,兩個查詢塊的一些group-by子句和聚合函數可以被消除。生成的查詢更簡單,包含更少的group-by子句和聚合函數。

分組和聚合是昂貴的操作,而它們的消除可能導致更優化的執行計劃。此外,這種類型的消除能夠觸發視圖合并,這又可以導致其他的優化得以應用。

考慮下面的例子,外層查詢被轉換了,所以只含有一個分組操作而不是兩個:

(圖27: 分組和聚合消除的例子)

相應的SQL執行計劃如下:


(圖28: 有轉換和沒有轉換的SQL執行計劃)

使用道具 舉報

回復
論壇徽章:
527
奧運會紀念徽章:壘球
日期:2008-09-15 01:28:12生肖徽章2007版:雞
日期:2008-11-17 23:40:58生肖徽章2007版:馬
日期:2008-11-18 05:09:48數據庫板塊每日發貼之星
日期:2008-11-29 01:01:02數據庫板塊每日發貼之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春紀念徽章
日期:2009-01-04 14:52:28數據庫板塊每日發貼之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食紀念
日期:2009-07-22 09:30:00
4#
 樓主| 發表于 2017-3-2 10:44 | 只看該作者
本帖最后由 newkid 于 2017-3-2 10:59 編輯

從Oracle 數據庫12c第二版開始有的:

基于成本的OR擴展轉換

Oracle 12.2數據庫中的新增功能是基于成本的OR擴展轉換。這種轉換是對12.2之前的“OR擴展”的增強,該功能自Oracle 9i以來就有。

OR擴展轉換可以被用來優化包含OR子句(技術上稱為“析取”)的查詢。 OR擴展的基本思想是將包含析取的查詢轉換為兩個或多個分支的UNION ALL查詢的形式。這是通過將析取分解為組件,并將每個組件與UNION ALL查詢的一個分支相關聯來實現的。 例如:

(圖29: 基于成本的OR擴展轉換例子)

OR擴展可以實現更高效的訪問路徑(索引訪問,分區裁剪),并且有時開啟了更多的連接方法選項。在Oracle 12.2數據庫之前,這種轉換在SQL執行計劃中是用CONCATENATION操作來指示的,它在語義上等同于UNION-ALL操作符。 從Oracle 12.2數據庫開始,UNION-ALL操作符將會顯示,這反映了為改進轉換所做的底層修改。特別地,在UNION ALL分支之上有更多機會應用其他轉換(因為用于替代訪問方法的成本算法已經被改進)。 每個UNION-ALL分支可以并行執行(對于CONCATENATION操作符就不是這樣),因此有希望在利用并行執行的決策支持應用中看到性能的改善。

考慮如下的SQL執行計劃,把Oracle數據庫12.1和12.2相比較:

(圖30: 對比Oracle數據庫12.1和12.2)

注意CONCATENATION如何被UNION-ALL替換,在個例子中,一個額外的轉換可用于消除對T_10K_HUNDRED表的額外掃描。

子查詢消除

許多應用程序含有這樣的查詢,它們的WHERE子句中包含一個單表子查詢。在下列條件下,這樣的查詢可以通過消除子查詢來優化:
>>子查詢包含單個表
>>這個表也在外層查詢中出現
>>相關/關聯謂詞中涉及到的列是一樣的
轉換將會從SQL執行計劃中消除表的訪問路徑。例如:

(圖31:子查詢消除的一個例子)

增強的連接消除

如果一個查詢的結果,帶連接和不帶連接都是一樣的,那么連接就就可以被消除。這是這種轉換背后的原則,它依賴于主鍵/唯一鍵和外鍵約束。在Oracle 12.2數據庫之前,轉換只能應用于單列鍵約束。 從Oracle 12.2數據庫開始,這種轉換在更多情況下被支持,具體地說,現在可以將多列的鍵約束用于轉換,在某些條件下還可以使用延遲約束。

轉換的應用是迭代性的,所以連接消除還可能觸發更進一步的連接消除。

圖32演示了這種轉換的影響。在這個例子中,對DEPATMENTS表的訪問路徑被消除了:


(圖32:連接消除的一個例子)

近似查詢處理

Oracle 12c數據庫添加了新的優化SQL函數APPROX_COUNT_DISTINCT()來為聚合的不同值提供近似的計數。對大量數據的處理明顯快于精確的聚合,特別是對于具有大量不同值的數據集,其結果和精確結果的偏差可以忽略不計。

對不同的值進行計數的需求是現今數據分析中的常見操作。對處理時間和消耗資源的優化以幾個數量級計,同時提供近乎精確的結果,這大大加速了現有的任何處理過程,并使得分析洞察力達到了新的水平。

Oracle 12.2數據庫擴展了這個功能,包括:
>>百分位數和中位數的近似版本(APPROXIMATE_PERCENTILE和APPROXIMATE_MEDIAN)。
>>物化視圖的支持和查詢重寫。
>>能夠通過設置會話級或系統級數據庫參數,代碼零修改就可使用近似SQL函數。

完整的詳細資料間參考文章3, "Oracle數據庫12c第二版的分析函數"。

SQL計劃的管理

對于需要保證SQL執行計劃穩定性的關鍵應用,SQL計劃管理(SPM)是一個非常重要的功能。此外,SPM是任何數據庫升級的基礎,以便以可控的方式將執行計劃從一個優化器版本演化為另一個版本,管理執行計劃并確保僅使用已知或已驗證的計劃。

Oracle 12c數據庫中的SQL計劃管理得到了許多增強:

  >>自動計劃演化
  >>強化的自動捕獲
  >>從AWR存儲庫捕獲

這些功能的詳細資料見參考文章4,“Oracle數據庫12c第二版的SQL計劃管理”

初始化參數

有幾個新的初始化參數可以管理Oracle 12c數據庫的優化器及其新特性。下面是關于這些新參數的詳細介紹。

OPTIMIZER_ADAPTIVE_FEATURES(在Oracle數據庫12c第一版中引入,在Oracle數據庫12c第二版棄用)

此參數在Oracle數據庫12c第二版中已過時,已被下面所述的OPTIMIZER_ADAPTIVE_PLANS和OPTIMIZER_ADAPTIVE_STATISTICS取代,它們為客戶提供了對優化器自適應功能的粒度更細的控制機制。

在Oracle數據庫12c第一版中,自適應查詢優化功能的使用(包括自適應連接和SQL計劃指令的產生和使用)是通過OPTIMIZER_ADAPTIVE_FEATURES參數來控制的。

如果 OPTIMIZER_ADAPTIVE_FEATURES 被設置為 TRUE, 那么在OPTIMIZER_FEATURES_ENABLE被設置為 12.1.0.1 或更高的情況下,所有自適應查詢優化功能都會被使用。

如果 OPTIMIZER_ADAPTIVE_FEATURES 被設置為 FALSE, 那么所有自適應查詢優化功能都不會被使用。

OPTIMIZER_ADAPTIVE_PLANS (新增于Oracle數據庫12c第二版, New in Oracle Database 12c Release 2, 取代OPTIMIZER_ADAPTIVE_FEATURES)

對自適應計劃功能的使用受控于OPTIMIZER_ADAPTIVE_PLANS參數。這個參數的缺省值是TRUE。這個參數控制的功能是:
  >>自適應連接
  >>位圖索引裁剪
  >>并行分配方法

如果 OPTIMIZER_ADAPTIVE_PLANS 被設置為 TRUE, 那么在OPTIMIZER_FEATURES_ENABLE被設置為 12.1.0.1 或更高的情況下,自適應計劃功能會被使用。
如果 OPTIMIZER_ADAPTIVE_PLANS 被設置為 FALSE, 那么自適應計劃功能不會被使用。

OPTIMIZER_ADAPTIVE_STATISTICS (新增于Oracle數據庫12c第二版, New in Oracle Database 12c Release 2, 取代OPTIMIZER_ADAPTIVE_FEATURES)

對自適應統計信息功能的使用受控于OPTIMIZER_ADAPTIVE_STATISTICS參數。這個參數的缺省值是FALSE。這個參數控制的功能是:

  >>在查詢優化中使用SQL計劃指令(SPDs)
  >>對連接的統計信息反饋
  >>對并行查詢的自適應動態取樣
  >>性能反饋

如果 OPTIMIZER_ADAPTIVE_STATISTICS 被設置為 TRUE, 那么在OPTIMIZER_FEATURES_ENABLE被設置為 12.1.0.1 或更高的情況下,自適應統計信息功能會被使用。
如果 OPTIMIZER_ADAPTIVE_STATISTICS 被設置為 FALSE, 那么自適應統計信息功能不會被使用。優化器繼續生成SQL計劃指令,但是它們不會和動態取樣一起被用于改善SQL執行計劃。

將OPTIMIZER_ADAPTIVE_STATISTICS設置為false會繼續保留著Oracle 11g數據庫引入的統計信息反饋功能(以前稱為基數反饋)。

OPTIMIZER_ADAPTIVE_REPORTING_ONLY
這個參數是從Oracle數據庫12c第一版開始才有的。為了更好地了解多少SQL語句會受到新的自適應計劃的影響,你可以將自適應計劃開啟為只報告模式,方法是將OPTIMIZER_ADAPTIVE_REPORTING_ONLY設置為TRUE(缺省值是FALSE)。在這個模式下,啟用自適應連接方法所需的信息被收集,但是不會有任何修改計劃的行動。這意味著缺省的計劃總是會被使用,但計劃在非報告模式下會如何調整的信息也會被收集。當這個參數被設置為TRUE, 優化器采取的決策可以通過在DBMS_XPLAN.DISPLAY_CURSOR中使用REPORT格式化參數來顯示。圖33顯示了如何查看報告的示例,為簡潔起見,默認的NESTED LOOPS計劃已被編輯掉了:

(圖33: 顯示一個自適應計劃報告)

通常情況下,比較有用的是檢查有多少個SQL執行計劃會被自適應計劃的啟用所影響。例如,將此參數設置為TRUE后,你可以檢查游標緩存中的游標,如下:

SET SERVEROUTPUT ON

declare
  cursor si is
   select sql_id,
          child_number
     from v$sql
    where is_resolved_adaptive_plan='Y'
      and parsing_schema_name in ('SYS','SYSTEM');
begin
   for r in si
   loop
      for p in (
          select *
            from table(dbms_xplan.display_cursor(
                             sql_id=>r.sql_id,
                             cursor_child_no=>r.child_number,
                             format=>'+report')
                      )
               )
      loop
          dbms_output.put_line(p.plan_table_output);
      end loop;
   end loop;
end;
/
         
OPTIMIZER_DYNAMIC_SAMPLING
雖然OPTIMIZER_DYNAMIC_SAMPLING參數不是新的,但它確實有了新的級別11, 這個級別控制動態統計信息的生成。當設置為級別11時,優化器會自動確定哪些語句會受益于動態統計信息,即使所有的對象已經有了統計信息。


結論

優化器被認為是Oracle數據庫最引人入勝的部件之一,這是因為它的復雜性。它的目的是為每個SQL語句確定最高效的執行計劃。它是基于查詢的結構,它所具有的可用的關于數據的統計信息,以及所有與優化器和執行相關的特性來作出這些決定的。

在Oracle 12c數據庫中,隨著新的自適應查詢優化方法的引入,還有對可用的統計信息的強化,優化器實現了一個巨大的飛躍。

新的查詢優化自適應方法使得優化器能夠對執行計劃作出實時調整,并且發現能夠導致更佳的統計信息的額外信息。利用這些信息,和已有的統計信息一起,能夠使得優化器對環境有更多的了解,并且允許它每次都選擇一個最優的執行計劃。

如同以往,我們希望通過詳細描述在這一版本中對優化器和統計信息的修改,圍繞著它們的迷霧將會被去除,而這一知識將會使得你的升級過程更加順利,先知先戒備,凡事預則立!

參考文章

在寫這篇文章的時候,下列白皮書的Oracle 12c R2版本還沒有發布。
它們很快就會被發布,同時也會涵蓋Oracle 12c R1的內容。
1. 了解Oracle數據庫12c第二版優化器統計信息
http://www.oracle.com/technetwor ... pts-12c-1963871.pdf
2. Oracle數據庫12c第二版優化器統計信息收集的最佳實踐
http://www.oracle.com/technetwor ... her-12c-1967354.pdf
3. Oracle數據庫12c第二版中的分析SQL
http://www.oracle.com/technetwor ... nalysis-2431343.pdf
4. Oracle數據庫12c第二版的SQL計劃管理
http://www.oracle.com/technetwor ... gmt-12c-1963237.pdf
5. Oracle數據庫12c的并行執行基礎知識
http://www.oracle.com/technetwor ... amentals-133639.pdf

使用道具 舉報

回復
論壇徽章:
403
紫蛋頭
日期:2012-05-21 10:19:41迷宮蛋
日期:2012-06-06 16:02:49奧運會紀念徽章:足球
日期:2012-06-29 15:30:06奧運會紀念徽章:排球
日期:2012-07-10 21:24:24鮮花蛋
日期:2012-07-16 15:24:59奧運會紀念徽章:拳擊
日期:2012-08-07 10:54:50奧運會紀念徽章:羽毛球
日期:2012-08-21 15:55:33奧運會紀念徽章:蹦床
日期:2012-08-21 21:09:51奧運會紀念徽章:籃球
日期:2012-08-24 10:29:11奧運會紀念徽章:體操
日期:2012-09-07 16:40:00
5#
發表于 2017-3-2 11:26 | 只看該作者
Oracle 12c R2優化器白皮書 -newkid翻譯.pdf (4.46 MB, 下載次數: 315)
打印版

使用道具 舉報

回復
論壇徽章:
1
秀才
日期:2016-11-25 16:52:36
6#
發表于 2017-3-2 11:29 | 只看該作者
好東西,mark!

使用道具 舉報

回復
論壇徽章:
0
7#
發表于 2017-3-2 13:11 | 只看該作者
      好東西,謝謝分享

使用道具 舉報

回復
論壇徽章:
311
行業板塊每日發貼之星
日期:2012-07-12 18:47:29雙黃蛋
日期:2011-08-12 17:31:04咸鴨蛋
日期:2011-08-18 15:13:51迷宮蛋
日期:2011-08-18 16:58:25紫蛋頭
日期:2011-08-31 10:57:28ITPUB十周年紀念徽章
日期:2011-09-27 16:30:47蜘蛛蛋
日期:2011-10-20 15:51:25迷宮蛋
日期:2011-10-29 11:12:59ITPUB十周年紀念徽章
日期:2011-11-01 16:19:41鮮花蛋
日期:2011-11-09 20:33:30
8#
發表于 2017-3-2 18:02 | 只看該作者
比如帶有LIKE謂詞和模糊匹配的查詢,而現在則會棄用動態統計信息。

啟用,

使用道具 舉報

回復
招聘 : 系統分析師
論壇徽章:
483
馬上有錢
日期:2014-02-19 11:55:14itpub13周年紀念徽章
日期:2014-09-29 01:14:14itpub13周年紀念徽章
日期:2014-10-08 15:15:25itpub13周年紀念徽章
日期:2014-10-08 15:15:25馬上有對象
日期:2014-10-12 11:58:40馬上有車
日期:2014-11-16 17:11:29慢羊羊
日期:2015-02-09 17:04:38沸羊羊
日期:2015-03-04 14:43:432015年新春福章
日期:2015-03-06 11:57:31ITPUB年度最佳版主
日期:2015-03-18 15:48:48
9#
發表于 2017-3-2 19:24 | 只看該作者
本帖最后由 lastwinner 于 2017-3-2 19:27 編輯

newkid出手,必屬精品!

ps:發帖時左下角,點擊“附加選項”,勾選“禁用表情”,之后如下字符都會顯示為字符而不是對應的圖片:
:o :p :)

使用道具 舉報

回復
論壇徽章:
527
奧運會紀念徽章:壘球
日期:2008-09-15 01:28:12生肖徽章2007版:雞
日期:2008-11-17 23:40:58生肖徽章2007版:馬
日期:2008-11-18 05:09:48數據庫板塊每日發貼之星
日期:2008-11-29 01:01:02數據庫板塊每日發貼之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春紀念徽章
日期:2009-01-04 14:52:28數據庫板塊每日發貼之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食紀念
日期:2009-07-22 09:30:00
10#
 樓主| 發表于 2017-3-2 20:47 | 只看該作者
ZALBB 發表于 2017-3-2 18:02
比如帶有LIKE謂詞和模糊匹配的查詢,而現在則會棄用動態統計信息。

啟用,

改過來了謝謝。
野花說的鬼臉符號沒看到,是在幾樓?昨天改了一個。

使用道具 舉報

回復

您需要登錄后才可以回帖 登錄 | 注冊

本版積分規則 發表回復

TOP技術積分榜 社區積分榜 徽章 團隊 統計 知識索引樹 積分競拍 文本模式 幫助
  ITPUB首頁 | ITPUB論壇 | 數據庫技術 | 企業信息化 | 開發技術 | 微軟技術 | 軟件工程與項目管理 | IBM技術園地 | 行業縱向討論 | IT招聘 | IT文檔
  ChinaUnix | ChinaUnix博客 | ChinaUnix論壇
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓優訊信息技術有限公司版權所有 聯系我們 
京ICP備09055130號-4  北京市公安局海淀分局網監中心備案編號:11010802021510 廣播電視節目制作經營許可證:編號(京)字第1149號
  
快速回復 返回頂部 返回列表
30岁的男人干啥赚钱快赚钱多 快3大小技巧稳赚方法如下 排三开奖直播现场直播 怎么买股票 棋牌彩票一体的游戏 湖北11选5任二遗漏表 股票上涨 辽宁快乐12网上投注app 正规十大理财平台排名 北京11选5任务最好遗漏 王中王中特免费资料精选