久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Oracle 12C優(yōu)化器的巨大變化,,上生產(chǎn)必讀(下)

 過河卒沖 2016-04-28





在Oracle 12c數(shù)據(jù)庫中,,隨著新的查詢優(yōu)化自適應方法的引入,還有對可用的統(tǒng)計信息的強化,,優(yōu)化器實現(xiàn)了一個巨大的飛躍,。《Oracle 12C優(yōu)化器的巨大變化,上生產(chǎn)必讀(上)》一文中,,已經(jīng)為大家介紹了優(yōu)化器和其統(tǒng)計信息的一些新的特性,,今天就讓我們繼續(xù)這個話題,一起來揭曉O(shè)racle 12C其他的強大功能吧,。


16
全局臨時表上的會話級統(tǒng)計信息


全局臨時表通常用于存儲應用程序上下文中的中間結(jié)果,。一個全局臨時表的定義,是全系統(tǒng)中擁有適當權(quán)限的所有用戶所共享的,,但其數(shù)據(jù)永遠是會話私有的,。在全局臨時表(必須是會話級臨時表,PRESERVE ROWS ON COMMIT,,提交時保留數(shù)據(jù))上收集統(tǒng)計信息是行得通的,;然而,在前一個版本中,,收集到的統(tǒng)計信息會被所有訪問這張表的會話所使用,。如果不同會話之間在臨時表中存儲的數(shù)據(jù)量或者數(shù)據(jù)的性質(zhì)有巨大差異,這樣就不太理想了,。


現(xiàn)在,,每個使用臨時表的會話都可以有一份單獨的統(tǒng)計信息。臨時表上共享的統(tǒng)計信息可以通過一個新的DBMS_STATS選項GLOBAL_TEMP_TABLE_STATS來進行控制,。在缺省情況下,,這個選項被設(shè)置為SESSION,意思是每個訪問臨時表的回航都會有自己的一套統(tǒng)計信息,。優(yōu)化器會試圖先使用會話的統(tǒng)計信息,但是如果會話統(tǒng)計信息不存在,,那么優(yōu)化器會使用共享統(tǒng)計信息,。如果你想回到以前的表現(xiàn),,即僅有一份統(tǒng)計信息被所有會話所使用,,可以將GLOBAL_TEMP_TABLE_STATS選項設(shè)為SHARED。


(圖25. 將全局臨時表不共享統(tǒng)計信息的缺省表現(xiàn)修改為強制共享統(tǒng)計信息)


當通過直接路徑操作往一張全局臨時表中填充數(shù)據(jù)(提交時保留數(shù)據(jù)的那種),,會話級的統(tǒng)計信息會被自動創(chuàng)建,,這是由于統(tǒng)計信息在線收集的作用,它免除了額外運行統(tǒng)計信息收集指令的必要性,,并且不會影響其他會話使用的統(tǒng)計信息,。


(圖26. 使用直接路徑加載對全局臨時表填充數(shù)據(jù)會導致會話級別的統(tǒng)計數(shù)據(jù)被自動收集)



17
DBMS_STATS包中的新的報告子程序


對于任何一個系統(tǒng),,為了維持一個可接受的性能水平,,知道何時收集,、如何收集及時的統(tǒng)計信息是至關(guān)重要的。想要確定一個環(huán)境中正在執(zhí)行的是什么樣的統(tǒng)計信息收集操作,,對統(tǒng)計方法的變動將會如何影響系統(tǒng),,這可能是一項困難且耗時的任務(wù),。在Oracle 12c數(shù)據(jù)庫中, 新的報告子程序被加入到DBMS_STATS包中使得我們更易于監(jiān)控何種統(tǒng)計收集活動正在進行,,以及對這些操作的參數(shù)進行修改會有什么影響,。


REPORT_STATS_OPERATIONS


這個新函數(shù)生成一個報表,,顯示的是關(guān)于在特定的時間窗口內(nèi)發(fā)生了何種統(tǒng)計收集活動的詳細信息,。報表給出的細節(jié)包括每種操作何時發(fā)生,,狀態(tài)如何,覆蓋了多少個對象,。報表可以輸出為文本或者HTML格式,。


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


REPORT_SINGLE_STATS_OPERATION


這個新函數(shù)生成一個關(guān)于指定的統(tǒng)計信息收集操作的詳細報表,。


REPORT_GATHER_*_STATS


這組新的函數(shù)實際上并不會收集統(tǒng)計信息,但是會報告一個對象的列表:假如對應的GATHER_*_STATS過程被以相同的參數(shù)設(shè)定所調(diào)用,,哪些對象將會被處理,。REPORT_GATHER_*_STATS接受的輸入?yún)?shù)和對應的GATHER_*_STATS過程相同,,多了兩個額外參數(shù):詳細級別(detail_level)以及格式(format)。


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


18
新的優(yōu)化技術(shù)


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


19
部分連接取值


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


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


考慮如下的DISTINCT查詢:



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


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


(圖29. Oracle 11g數(shù)據(jù)庫要求在ORDERS 和 CUSTOMERS之間完全的連接,,然后用unique sort去除重復)


有了部分連接取值,ORDERS 和 CUSTOMERS之間的連接被轉(zhuǎn)換為一個半連接,,這意味著一旦在CUSTOMERS表中找到一個匹配的CUSTOMER_ID,,查詢就會轉(zhuǎn)移到下一個CUSTOMER_ID。通過將哈希連接轉(zhuǎn)換為半連接,,流入SORT UNIQUE 的行數(shù)大大減少,因為重復的行已經(jīng)被去除了,。變換過的SQL的計劃如圖30所示,。(譯者注:變換之后是HASH UNIQUE不是SORT UNIQUE)


(圖 30. Oracle 12c數(shù)據(jù)庫的計劃顯示了ORDERS 和 CUSTOMERS之間完全的半連接,,沒有產(chǎn)生重復的行)


20
接受空值的半連接


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


考慮如下的查詢:



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


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


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


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


21
標量子查詢的展開


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



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


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


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



(圖34. Oracle 12c數(shù)據(jù)庫的計劃顯示標量子查詢已經(jīng)被展開成外連接和GROUP BY視圖)


22
多表左外連接


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


(圖 35. Oracle 11g數(shù)據(jù)庫不支持多表左外連接)


執(zhí)行這樣一個查詢的方法是將其翻譯為ANSI語法,。可是,,實現(xiàn)這樣的ANSI語法會導致一個橫向視圖被使用,。Oracle無法合并橫向視圖,所以優(yōu)化器的計劃在連接順序和連接方法上的選擇就受到了限制,,這可能導致不理想的計劃,。

(注:橫向視圖指的是這樣的視圖:它引用了不在視圖中的表的列


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


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


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



23
初始化參數(shù)



有幾個新的初始化參數(shù)可以管理Oracle 12c數(shù)據(jù)庫的優(yōu)化器及其新特性,。下面是關(guān)于這些新參數(shù)的詳細介紹。


OPTIMIZER_ADAPTIVE_FEATURES

對于新的自適應查詢優(yōu)化功能的使用,,包括自適應連接,,SQL計劃指令的創(chuàng)建和使用,是受OPTIMIZER_ADAPTIVE_FEATURES參數(shù)控制的,。這個參數(shù)的缺省值和OPTIMIZER_FEATURES_ENABLE(OFE)相關(guān),。如果OFE被設(shè)置為12.1.0.1或者更高,那么OPTIMIZER_ADAPTIVE_FEATURES被設(shè)為TRUE, 所有的自適應查詢優(yōu)化功能將會啟用,。如果OFE被設(shè)為比12.1.0.1更低,,那么OPTIMIZER_ADAPTIVE_FEATURES將會被設(shè)為FALSE, 所有的自適應查詢優(yōu)化功能都不會啟用。


OPTIMIZER_ADAPTIVE_REPORTING_ONLY


乍一看,,執(zhí)行計劃的自適應或者中途變動有些嚇人,。為了更好地理解多少SQL語句會受到新的自適應計劃的影響,你可以將自適應計劃開啟為只報告模式,,方法是將OPTIMIZER_ADAPTIVE_REPORTING_ONLY設(shè)置為TRUE(缺省值是FALSE),。在這個模式下,,啟用自適應連接方法所需的信息被收集,但是不會有任何修改計劃的行動,。這意味著缺省的計劃總是會被使用,,但計劃在非報告模式下會如何調(diào)整的信息也會被收集。


OPTIMIZER_DYNAMIC_SAMPLING


雖然OPTIMIZER_DYNAMIC_SAMPLING參數(shù)不是新的,,但它確實有了新的級別11, 這個級別控制動態(tài)統(tǒng)計信息的生成,。當設(shè)置為級別11時,優(yōu)化器會自動確定哪些語句會受益于動態(tài)統(tǒng)計信息,,即使所有的對象已經(jīng)有了統(tǒng)計信息,。


24
對現(xiàn)有功能的強化


在Oracle 12c數(shù)據(jù)庫的開發(fā)過程中,大量的時間是被花在改善現(xiàn)有的優(yōu)化器特性和功能,,使得它更易于獲得最佳的統(tǒng)計信息,,確保最優(yōu)的執(zhí)行計劃被選中。這個章節(jié)將會詳細描述對現(xiàn)有優(yōu)化器以及輸送給它的統(tǒng)計信息的各方面的強化,。


SQL計劃的管理


SQL計劃的管理 (SPM)是Oracle 11g數(shù)據(jù)庫中最受歡迎的優(yōu)化器新特性之一,因為它確保性能不會因為執(zhí)行計劃的變動而下降,。為了確保這一點,,只有被接受的執(zhí)行計劃才會被使用;任何實際發(fā)生了的計劃的演變都會被跟蹤并且在隨后的一個時間點進行評估,,并且只有當新計劃在運行時間上顯示出可觀的改善,,才會被接受。SQL計劃的管理有三個主要部件:


1. 計劃的捕獲:


SQL計劃基線的創(chuàng)建,,它們存儲了所有相關(guān)的SQL語句的執(zhí)行計劃,。SQL計劃基線存儲在SYSAUX表空間的SQL管理庫中。


2. 計劃的選擇


對于具備SQL計劃基線的語句,,確保僅有被接受的執(zhí)行計劃才會被使用,,并且把為一個語句找到的新的執(zhí)行計劃,記錄為未接受計劃并存儲在SQL計劃基線中,。


3. 計劃的演變


為一個給定的語句評估所有未接受計劃,,只有那些顯示出性能改善的計劃才會變成SQL計劃基線中被接受的計劃。


在Oracle 12c數(shù)據(jù)庫中,,SPM的計劃演變已被強化,,以允許計劃的自動演變。

計劃的自動演變是由SPM的演變顧問完成的,。演變顧問是一項自動任務(wù)(SYS_AUTO_SPM_EVOLVE_TASK),,它在夜晚的維護窗口進行操作,自動為SPM中的未接受計劃執(zhí)行演變過程,。自動任務(wù)將所有SPM中的未接受計劃排等級(新發(fā)現(xiàn)的計劃排在最高級),,然后在維護窗口關(guān)閉之前為盡可能多的計劃執(zhí)行演變過程,。


所有那些未接受計劃,如果性能比計劃基線中現(xiàn)有的計劃更好,,則自動被接受,。然而,如果未接受計劃未能達到性能標準,,則仍然保持為未接受狀態(tài),,并且它們的 LAST_VERIFIED會被修改為當前時間戳。至少在30天內(nèi),,自動任務(wù)不會試圖將一個未接受計劃再次進行演變, 在此之后也僅當SQL為激活狀態(tài)(LAST_EXECUTED被修改過)才會演變,。


夜間的演變?nèi)蝿?wù)的結(jié)果可以通過DBMS_SPM.REPORT_AUTO_EVOLVE_TASK函數(shù)查看。SPM演變顧問的任何方面都可以通過企業(yè)管理器或者PL/SQL包DBMS_AUTO_TASK_ADMIN進行管理,。


此外,,你也可以利用ORACLE企業(yè)管理器或者提供的DBMS_SPM包對未接受計劃手動進行演變。從Oracle 12c開始,,原有的SPM演變函數(shù)(DBMS_SPM.EVOLVE_SQL_PLAN_BASELINE)被廢棄,,代之以新的調(diào)用演變顧問的API。圖38展示了調(diào)用演變顧問的一系列步驟,。典型的過程為三個步驟的處理,,從演變?nèi)蝿?wù)的創(chuàng)建開始。每個任務(wù)都被給予一個唯一的名字,,這使得它可以被多次執(zhí)行,。一旦任務(wù)被執(zhí)行,你就可以查看演變報告,,方法是為DBMS_SPM.REPORT_EVOLVE_TASK函數(shù)提供TASK_ID和EXEC_ID,。


(圖38. 手動調(diào)用演變顧問所需的步驟)


當演變顧問被手動調(diào)用,未接受的計劃不會被自動接受,,即使它達到了性能標準,。計劃必須使用DBMS_SPM.ACCEPT_SQL_PLAN_BASELINE 過程被手動接受。演變報告含有詳細的指導信息,,包括關(guān)于接受計劃所需的特定的語法,。


(圖39. 手動接受一個SQL基線中的計劃)


在原先,只有SQL語句的綱要(即outline, 是為了重現(xiàn)一個特定計劃而必需的一套完整的提示集合)被捕獲并作為SQL計劃基線的一部分,。從Oracle 12c數(shù)據(jù)庫開始,,當一個計劃被添加到SQL計劃基線,實際的執(zhí)行計劃也會被記錄下來,。對于那些在以前的版本被添加到SQL計劃基線中的執(zhí)行計劃,,當它們第一次在Oracle 12c數(shù)據(jù)庫中被執(zhí)行,實際的執(zhí)行計劃也會被添加到SQL計劃基線中。


捕獲實際執(zhí)行計劃是很重要的,,這是為了確保一個SQL計劃基線從一個系統(tǒng)被轉(zhuǎn)移到另一系統(tǒng)時,,SQL計劃基線中的計劃仍然能被顯示,即使它所用到的某些對象或者解析模式本身在新系統(tǒng)中已經(jīng)不存在了,。注意,,顯示一個來自SQL計劃基線中的計劃,和能夠重現(xiàn)這個計劃,,這是兩件不同的事情,。


對于SQL計劃基線的任何計劃,其詳細的執(zhí)行計劃可以被顯示,,方法是在企業(yè)管理器的SQL計劃基線頁面點擊計劃的名稱,,或者使用DBMS_XPLAN.DISPLAY_SQL_PLAN_BASELINE過程。圖40顯示了被接受的計劃(SQL_PLAN_6zsnd8f6zsd9g54bc8843)的執(zhí)行計劃,。所顯示的計劃,,是當這個計劃被添加到SQL計劃基線所捕獲到的實際計劃,因為'plan rows'屬性被設(shè)置為'From dictionary'(來自數(shù)據(jù)字典),。對于那些基于綱要而顯示的計劃,,'plan rows'屬性被設(shè)置為'From outline'(來自綱要)。


(圖40. 顯示來自SQL計劃基線中的一個計劃)


強化統(tǒng)計信息


連同優(yōu)化器統(tǒng)計信息這一領(lǐng)域的許多新功能一起,,現(xiàn)有的統(tǒng)計信息收集技術(shù)也得到了幾種強化,。


增量統(tǒng)計信息


在分區(qū)表上收集統(tǒng)計信息,包括在表級(全局統(tǒng)計信息)和分區(qū)(子分區(qū))級別的收集,。如果一個分區(qū)表的INCREMENTAL屬性被設(shè)為TRUE, DBMS_STATS.GATHER_*_STATS過程的GRANULARITY(粒度)參數(shù)包含GLOBAL,并且ESTIMATE_PERCENT被設(shè)為AUTO_SAMPLE_SIZE,,那么ORACLE就會通過將分區(qū)級的統(tǒng)計信息進行聚合,,精確地推導出所有全局級別的統(tǒng)計信息。


增量統(tǒng)計信息的工作原理是為表中的每個分區(qū)存儲一份綱要(synopsis),。綱要是一種關(guān)于分區(qū)以及分區(qū)中的列的統(tǒng)計元數(shù)據(jù),。通過將每個分區(qū)的分區(qū)級統(tǒng)計信息及綱要進行聚合,可以精確地生成全局級別的統(tǒng)計信息,,從而不必掃描整個表,。


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


在Oracle 11g數(shù)據(jù)庫中,如果一張表的增量統(tǒng)計被打開,,當其中的一個分區(qū)的一行數(shù)據(jù)被修改時,,那個分區(qū)的統(tǒng)計信息就被認為已經(jīng)過于陳舊,必需被重新收集才能用于生成全局級別的統(tǒng)計信息,。


在Oracle 12c數(shù)據(jù)庫中,,一個稱為INCREMENTAL_STALENESS的新屬性允許你控制分區(qū)統(tǒng)計信息何時被認為已陳化,并且不能勝任生成全局統(tǒng)計信息。在缺省情況下,,INCREMENTAL_STALENESS被設(shè)為NULL, 這意味著一旦有一行數(shù)據(jù)被修改,,分區(qū)級統(tǒng)計就被認為已陳化(和11g相同)。


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


增量統(tǒng)計信息以及分區(qū)交換加載


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


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


在Oracle 12c數(shù)據(jù)庫中,,必要的統(tǒng)計信息(綱要)可以在非分區(qū)表上創(chuàng)建,從而使得在分區(qū)交換中被交換的統(tǒng)計信息能夠自動被用于增量維護全局統(tǒng)計信息,。新的DBMS_STATS表屬性INCREMENTAL_LEVEL可以被用來識別那些即將用于分區(qū)交換加載的非分區(qū)表,。通過將INCREMENTAL_LEVEL設(shè)置為TABLE(缺省值是PARTITION),Oracle會在收集統(tǒng)計信息的時候自動為這張表創(chuàng)建一個綱要(synopsis),。這個表級的綱要,,在交換加載結(jié)束后會變成分區(qū)級的綱要。


并發(fā)統(tǒng)計信息


在Oracle 11.2.0.2數(shù)據(jù)庫中,,統(tǒng)計信息的并發(fā)收集被引入,。當全局統(tǒng)計信息的收集屬性CONCURRENT被設(shè)置,Oracle會利用作業(yè)調(diào)度器和高級隊列部件來為每一個對象(表或者分區(qū))創(chuàng)建和管理一個并發(fā)的作業(yè),。


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

通過將CONCURRENT選項設(shè)置為ALL或者AUTOMATIC,,統(tǒng)計信息的并發(fā)收集現(xiàn)在可以被夜間統(tǒng)計信息收集作業(yè)所利用,。新的ORA$AUTOTASK消費者群組被加入到資源管理器,在維護窗口期間被激活使用,,以確保統(tǒng)計信息的并發(fā)收集不會占用太多的系統(tǒng)資源,。


列群組的自動偵測


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


列群組的自動偵測,,會自動根據(jù)給定的工作負載確定一張表上需要哪些列群組。請注意這個功能不會為帶有函數(shù)的列創(chuàng)建擴展統(tǒng)計信息,,它只能用于列群組,。列群組的自動偵測是一個簡單的三步驟的過程:


1.啟動列的使用情況


為了確定適當?shù)牧腥航M,Oracle必需對具有代表性的工作負載進行觀察,。工作負載可以在SQL優(yōu)化集(SQL Tuning Set)中提供, 或者通過對運行中的系統(tǒng)進行監(jiān)控而獲得,。新的過程DBMS_STATS.SEED_COL_USAGE應該被使用,它指明了工作負載,,并且告訴Oracle應該對工作負載觀察多長時間,。下列例子為當前系統(tǒng)打開了5分鐘或者300秒的監(jiān)控。


(圖41開啟列群組的自動偵測)


監(jiān)控過程記錄不同的信息,,來自于你在sys.col_usage$可看到的傳統(tǒng)的列使用信息,,并且把它存放在sys.col_group_usage$,。對于在監(jiān)控窗口過程中被執(zhí)行或者解釋的任何SQL, 這個信息都會被存儲,。一旦監(jiān)控窗口結(jié)束,你就可以使用新函數(shù)DBMS_STATS.REPORT_COL_USAGE來查看為特定的一個表記錄的列使用信息,。這個函數(shù)產(chǎn)生一個報表,,它列出了在工作負載中這個表的哪些列被用于過濾謂詞,連接謂詞和分組子句,。你也可以運行DBMS_STATS.REPORT_COL_USAGE來查看特定模式下的所有表的報告,,只需提供模式名稱,并將表名設(shè)為NULL。


(圖42. 查看列使用情況)


2.創(chuàng)建列群組


為每個表調(diào)用DBMS_STATS.CREATE_EXTENDED_STATS函數(shù),,它就會自動根據(jù)監(jiān)控窗口過程中捕獲到的列使用信息自動創(chuàng)建必要的列群組,。一旦擴展信息被創(chuàng)建,不管什么時候表統(tǒng)計信息被收集,,它們就會被自動維護,。


此外,列群組也可被手動創(chuàng)建,,方法是將群組指定為DBMS_STATS.CREATE_EXTENDED_STATS的第三個參數(shù),。


(圖43. 創(chuàng)建自動偵測到的列群組)


3.再度收集統(tǒng)計信息


最后的步驟是在受影響的表上再度收集統(tǒng)計信息,使得新創(chuàng)建的列群組擁有為它們創(chuàng)建的統(tǒng)計信息,。


(圖44.每當統(tǒng)計信息被收集,,列群組統(tǒng)計就會被自動維護)


結(jié)論


優(yōu)化器是Oracle數(shù)據(jù)庫最吸引人的部件之一,這是因為它的復雜性,。它的目的是為每個SQL語句確定最高效的執(zhí)行計劃,。它是基于查詢的結(jié)構(gòu),它所具有的可用的關(guān)于數(shù)據(jù)的統(tǒng)計信息,,以及所有與優(yōu)化器和執(zhí)行相關(guān)的特性來作出這些決定的,。在Oracle 12c數(shù)據(jù)庫中,隨著新的查詢優(yōu)化自適應方法的引入,,還有對可用的統(tǒng)計信息的強化,,優(yōu)化器實現(xiàn)了一個巨大的飛躍。


新的查詢優(yōu)化自適應方法使得優(yōu)化器能夠?qū)?zhí)行計劃作出實時調(diào)整,,并且發(fā)現(xiàn)能夠?qū)е赂训慕y(tǒng)計信息的額外信息,。利用這些信息,和已有的統(tǒng)計信息一起,,能夠使得優(yōu)化器對環(huán)境有更多的了解,,并且允許它每次都選擇一個優(yōu)化的執(zhí)行計劃。


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


譯者介紹  蘇旭輝

  • 網(wǎng)絡(luò)ID:newkid,,從事IT行業(yè)20余年,,現(xiàn)定居加拿大多倫多;

  • Oracle資深開發(fā)大師,,幫助過無數(shù)網(wǎng)友解決過ORACLE疑難問題,;

  • 《劍破冰山-Oracle開發(fā)藝術(shù)》副主編,。


作者: Maria Colgan

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點,。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,,謹防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報,。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多