1. 程式人生 > >Oracle 12C優化器的巨大變化,上生產必讀(下)

Oracle 12C優化器的巨大變化,上生產必讀(下)

在Oracle 12c資料庫中,隨著新的查詢優化自適應方法的引入,還有對可用的統計資訊的強化,優化器實現了一個巨大的飛躍。在《Oracle 12C優化器的巨大變化,上生產必讀(上)》一文中,已經為大家介紹了優化器和其統計資訊的一些新的特性,今天就讓我們繼續這個話題,一起來揭曉Oracle 12C其他的強大功能吧。

16、全域性臨時表上的會話級統計資訊

全域性臨時表通常用於儲存應用程式上下文中的中間結果。一個全域性臨時表的定義,是全系統中擁有適當許可權的所有使用者所共享的,但其資料永遠是會話私有的。在全域性臨時表(必須是會話級臨時表,PRESERVE ROWS ON COMMIT,提交時保留資料)上收集統計資訊是行得通的;然而,在前一個版本中,收集到的統計資訊會被所有訪問這張表的會話所使用。如果不同會話之間在臨時表中儲存的資料量或者資料的性質有巨大差異,這樣就不太理想了。

現在,每個使用臨時表的會話都可以有一份單獨的統計資訊。臨時表上共享的統計資訊可以通過一個新的DBMS_STATS選項GLOBAL_TEMP_TABLE_STATS來進行控制。在預設情況下,這個選項被設定為SESSION,意思是每個訪問臨時表的回航都會有自己的一套統計資訊。優化器會試圖先使用會話的統計資訊,但是如果會話統計資訊不存在,那麼優化器會使用共享統計資訊。如果你想回到以前的表現,即僅有一份統計資訊被所有會話所使用,可以將GLOBAL_TEMP_TABLE_STATS選項設為SHARED。

Oracle 12C優化器

 (圖25. 將全域性臨時表不共享統計資訊的預設表現修改為強制共享統計資訊)

當通過直接路徑操作往一張全域性臨時表中填充資料(提交時保留資料的那種),會話級的統計資訊會被自動建立,這是由於統計資訊線上收集的作用,它免除了額外執行統計資訊收集指令的必要性,並且不會影響其他會話使用的統計資訊。

Oracle12C優化器

(圖26. 使用直接路徑載入對全域性臨時表填充資料會導致會話級別的統計資料被自動收集)

17、DBMS_STATS包中的新的報告子程式

對於任何一個系統,為了維持一個可接受的效能水平,知道何時收集、如何收集及時的統計資訊是至關重要的。想要確定一個環境中正在執行的是什麼樣的統計資訊收集操作,對統計方法的變動將會如何影響系統,這可能是一項困難且耗時的任務。在Oracle 12c資料庫中, 新的報告子程式被加入到DBMS_STATS包中,使得我們更易於監控何種統計收集活動正在進行,以及對這些操作的引數進行修改會有什麼影響。

REPORT_STATS_OPERATIONS

這個新函式生成一個報表,顯示的是關於在特定的時間視窗內發生了何種統計收集活動的詳細資訊。報表給出的細節包括每種操作何時發生,狀態如何,覆蓋了多少個物件。報表可以輸出為文字或者HTML格式。

Oracle12C優化器

(圖27. 生成一個新的 DBMS_STATS.REPORT_STATS_OPERATIONS 報表)

REPORT_SINGLE_STATS_OPERATION

這個新函式生成一個關於指定的統計資訊收集操作的詳細報表。

REPORT_GATHER_*_STATS

這組新的函式實際上並不會收集統計資訊,但是會報告一個物件的列表:假如對應的GATHER_*_STATS過程被以相同的引數設定所呼叫,哪些物件將會被處理。REPORT_GATHER_*_STATS接受的輸入引數和對應的GATHER_*_STATS過程相同,多了兩個額外引數:詳細級別(detail_level)以及格式(format)。

Oracle12C優化器

(圖28. 生成新的DBMS_STATS.REPORT_GATHER_SCHEMA_STATS 報表)

18、新的優化技術

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

19、部分連線取值

部分連線取值是這樣一種優化技術,它是在連線順序的生成過程中被使用的。這種技術的目標是為了避免產生重複的行,如果不用這種技術,這些重複只能在計劃中隨後用一個DISTINCT操作符來去除。通過早些用一個內連線(INNER JOIN)或者半連線(SEMI-JOIN)來取代DISTINCT操作符,這一步驟產生的行數將會減少。這應該會使得計劃的總體效能得到改善,因為隨後的步驟只需在縮小的行的集合上進行操作。

這種優化可以應用在如下型別的查詢塊:MAX(),MIN(), SUM(distinct), AVG (distinct), COUNT (distinct), 以及UNION, MINUS, INTERSECT 操作符的分支, [NOT] EXISTS 子查詢等等。

考慮如下的DISTINCT查詢:

Oracle12C優化器