1. 程式人生 > >Oracle12c中SQL效能優化(SQL TUNING)新特性之自動重優化(automatic reoptimization)

Oracle12c中SQL效能優化(SQL TUNING)新特性之自動重優化(automatic reoptimization)

Oracle12c中的自適應查詢優化有一系列不同特點組成。像自適應計劃(AdaptivePlans)功能可以在執行時修改執行計劃,但並不允許計劃中連線順序的改變。自動重優化基於先前執行和反饋到優化器資訊的學習,因此,語句下次解析執行時將會生成一個較好的計劃。

1.   統計資訊反饋(勢反饋)

勢反饋(Cardinalityfeedback)在Oracle11r2中被引進。當優化器產生一個執行計劃時,統計資訊缺失、統計資訊陳舊、複雜謂詞或複雜操作等也許會觸發優化器監視計劃中各個操作的勢。一旦執行完成,如果評估和實際勢之間差別較大,實際勢將會被存在SGA中以備今後使用,且該語句也被標作可重優化。該語句下次執行時會採用儲存的勢來進行重優化,以便採用較好的計劃。勢反饋是語句確定的,且例項重啟或共享池中的語句陳舊時會丟失。Oracle12c中,勢反饋已經重新命名為統計資訊反饋。

--注:

1)   統計資訊反饋相關資訊在SGA中作為V$SQL_REOPTIMIZATION_HINTS 檢視中的OPT_ESTIMATE hints 儲存。該檢視和hints未被歸檔。

1.1.  示例

下面的程式碼建立一個管道表函式,通過它說明統計資訊反饋

CONN test1/[email protected]

-- 建立支援表函式的型別

DROP TYPE tp_tf_tab;

DROP TYPE tp_tf_row;

CREATE TYPE tp_tf_row AS OBJECT (

  id           NUMBER,

  description  VARCHAR2(50)

);

/

CREATE TYPE tp_tf_tab IS TABLE OF tp_tf_row;

/

-- 建立表函式.

CREATE OR REPLACE FUNCTION f_tab_pl (p_rows IN NUMBER) RETURN tp_tf_tabPIPELINED AS

BEGIN

  FOR i IN 1 .. p_rows LOOP

    PIPE ROW (tp_tf_row(i,'Description for ' || i));

  END LOOP;

  RETURN;

END;

/

我們知道,優化器總是基於資料庫塊大小來評估管道表函式的勢,因此,我們希望得到該管道函式查詢勢的一個錯誤評估。下面的查詢返回10行資料,但優化器評估出了8168行,這顯然是錯誤的。

SELECT /*+ GATHER_PLAN_STATISTICS */ * FROM TABLE(f_tab_pl(10));

SET LINESIZE 200 PAGESIZE 100

SELECT * FROM TABLE(DBMS_XPLAN.display_cursor(format => 'allstatslast'));

PLAN_TABLE_OUTPUT

-------------------------------------------------------------------------------------------------

SQL_ID  0ktmsgvczysxy, child number0

-------------------------------------

SELECT /*+ GATHER_PLAN_STATISTICS */ * FROM TABLE(f_tab_pl(10))

Plan hash value: 822655197

-------------------------------------------------------------------------------------------------

| Id  | Operation                         | Name        | Starts | E-Rows | A-Rows |   A-Time  |

-------------------------------------------------------------------------------------------------

|   0 | SELECT STATEMENT                  |             |      1 |       |     10 |00:00:00.01 |

|   1 |  COLLECTION ITERATOR PICKLER FETCH|F_TAB_PL    |      1 |  8168 |     10 |00:00:00.01 |

-------------------------------------------------------------------------------------------------

SQL>

檢查檢視列V$SQL.IS_REOPTIMIZABLE顯示優化器已經探測到了不正確的勢評估並把該語句標示為將被重新優化。

COLUMN sql_text FORMAT A50

COLUMN is_reoptimizable FORMAT A16

SELECT sql_text, is_reoptimizable

FROM   v$sql

WHERE  sql_text LIKE '%f_tab_pl%'

AND    sql_text NOT LIKE '%v$sql%';

SQL_TEXT                                          IS_REOPTIMIZABLE

-------------------------------------------------- ----------------

SELECT /*+ GATHER_PLAN_STATISTICS */       * FROM Y

   TABLE(f_tab_pl(10))

SQL>

如果再次執行該語句,我們將看到更精確的一個勢評估,且有個注意部分告訴我們採用了統計資訊反饋。同時,也注意到子游標號也發生了改變。

SELECT /*+ GATHER_PLAN_STATISTICS */ * FROM   TABLE(f_tab_pl(10));

SET LINESIZE 200 PAGESIZE 100

SELECT * FROM TABLE(DBMS_XPLAN.display_cursor(format => 'allstatslast'));

PLAN_TABLE_OUTPUT

-------------------------------------------------------------------------------------------------

SQL_ID  0ktmsgvczysxy, child number1

-------------------------------------

SELECT /*+ GATHER_PLAN_STATISTICS */       * FROM

TABLE(f_tab_pl(10))

Plan hash value: 822655197

-------------------------------------------------------------------------------------------------

| Id  | Operation                         | Name        | Starts | E-Rows | A-Rows |   A-Time  |

-------------------------------------------------------------------------------------------------

|   0 | SELECT STATEMENT                  |             |      1 |       |     10 |00:00:00.01 |

|   1 |  COLLECTION ITERATOR PICKLER FETCH|F_TAB_PL    |      1 |    20 |     10 |00:00:00.01 |

-------------------------------------------------------------------------------------------------

Note

-----

   - statistics feedback used forthis statement

SQL>

--注:

1)   11Rr2版本中,注意部分將會是"cardinality feedbackused for this statement"。

2)   文件中也提到,勢的錯誤評估也會導致生成SQL計劃指令(SQLplan directives) ,但不要誤以為統計資訊反饋被保留在SQL計劃指令中。我們可以通過如下語句查詢SQL計劃指令是否存在。

CONN [email protected] AS SYSDBA

EXEC DBMS_SPD.flush_sql_plan_directive;

SET LINESIZE 200

COLUMN dir_id FORMAT A20

COLUMN owner FORMAT A10

COLUMN object_name FORMAT A10

COLUMN col_name FORMAT A10

SELECT TO_CHAR(d.directive_id) dir_id, o.owner, o.object_name,

       o.subobject_name col_name,o.object_type, d.type, d.state, d.reason

FROM   dba_sql_plan_directives d,dba_sql_plan_dir_objects o

WHERE  d.directive_id=o.directive_id

AND    o.owner = 'TEST'

ORDER BY 1,2,3,4,5;

no rows selected

SQL>

2.   效能反饋(Performance Feedback)

Oracle 11gR2引進了PARALLEL_DEGREE_POLICY初始化引數用以簡化並行查詢。該引數預設值為MANUAL,當被設定為AUTO時,能使並行度確定,語句排隊和記憶體內並行執行自動化。

Oracle 12cR1為該引數增加了ADAPTIVE設定,該值類似於AUTO,但包括了效能反饋。這種情況下,優化器決定語句是否並行執行和合適的並行度。當完成時,會對語句的實際效能和初始優化階段的評估效能進行對比。如果兩者間差別很大,則實際效能統計資訊被儲存為統計資訊反饋,且語句也被標為可重新優化的。當該語句下次被執行時,統計資訊反饋會被用來選擇一個更合適的並行度(DOP)。

--注:

1)   從Oracle 11gR2向後,語句中的PARALLEL hint將導致系統自動選擇並行度,而不管PARALLEL_DEGREE_POLICY設定為什麼值。

3.   統計資訊反饋和SQL計劃指令(相互作用)

該部分大多基於我對統計資訊反饋的經驗推測。先前我們做測試的語句並不會儲存為SQL計劃指令。統計資訊反饋指示優化器已經做了不好的選擇,這些選擇一般是因為確定執行計劃時缺失重要的資訊。統計資訊反饋能被用於重優化,但它並不解決最初的問題。基本統計資訊還是不具有代表性。

SQL計劃指令是“額外提示”,能阻止優化器在將來犯同樣的錯誤。在有些場景,自動重優化也會導致生成SQL計劃執行,但這並不包括統計資訊反饋和效能反饋,而是執行動態取樣來解決短期內偏離問題,因此,不再需要統計資訊反饋。

由於SQL計劃指令影響DBMS_STATS包未來收集統計資訊的方式,因此,通過為基礎統計資訊新增另外的資訊(擴充套件統計資訊),它有能力從根本上解決問題,從而使不再需要SQL計劃執行和統計資訊反饋。一個需要統計資訊反饋的場景也許會生成SQL計劃指令,但那並不意味著SQL計劃指令包含統計資訊反饋的一個可保留版本。

當統計資訊反饋和SQL計劃指令因勢錯誤評估而都被建立時,在兩者間有些很有意思的相互作用:

Ø 兩者都被在SGA中建立但SQL計劃指令還未被保留到SYSAUX表空間的場景中,統計資訊反饋在重優化期間被使用,期間忽視SQL計劃指令的存在。

Ø 兩者都被建立但SQL計劃指令被保留到SYSAUX表空間的場景,SQL計劃指令在重優化期間被使用,統計資訊反饋也可能被使用。

由於SQL計劃指令僅僅被週期性的保留,這意味著依賴於SQL語句第一次和第二次執行間時間的長短,最後的重優化可能是完全不同的,這導致結果的不可預測。

相關推薦

Oracle12cSQL效能優化SQL TUNING特性自動優化automatic reoptimization

Oracle12c中的自適應查詢優化有一系列不同特點組成。像自適應計劃(AdaptivePlans)功能可以在執行時修改執行計劃,但並不允許計劃中連線順序的改變。自動重優化基於先前執行和反饋到優化器資訊的學習,因此,語句下次解析執行時將會生成一個較好的計劃。1.   統計資訊

Oracle12cSQL性能優化SQL TUNING特性自動優化automatic reoptimization

num sysdba number 並行執行 loop pdb state 周期性 align Oracle12c中的自適應查詢優化有一系列不同特點組成。像自適應計劃(AdaptivePlans)功能可以在運行時修改執行計劃,但並不允許計劃中連接順序的改變。自動重優化

oracle11gSQL優化SQL TUNING特性Adaptive Cursor Sharing (ACS)

ise cut info xtend 優化器 指標 語法 oracl 綁定 1. ACS簡介 Oracle Database 11g提供了Adaptive Cursor Sharing (ACS)功能,以克服以往不該共享的遊標被共享的可能性。ACS使用兩個新指標:se

Oracle12c中性能優化&功能增強特性全局索引DROP和TRUNCATE 分區的異步維護

stats The valid AI sys 加載 元數據 SQ 調度 Oracle 12c中,通過延遲相關索引的維護可以優化某些DROP和TRUNCATE分區命令的性能,同時,保持全局索引為有效。 1. 設置 下面的例子演示帶全局索引的表創建和加載數據的過程。

Java 8特性接口改善八惡人-1

1.8 我想 when 直接 有一個 圖片 class java類 聖誕節 Daisy Donergue 多莫歌·黛西 “By woman, you mean her?” 她也能叫女人?   Java 8在13年9月發布,寫這篇博文的時間已經是17年12月份了。

ECMAScript5/6特性函式的優化

/*函式的優化*/ //以前 function sum(a,b) { return a+b; } //優化 const add = (a,b)=>a+b; //以前 const p1 = { name:"mike", age:21, sayHello:func

ABAP 7.53 的ABAP SQL原Open SQL特性

S/4 HANA 1809 已經在上月釋出,隨之而來的是ABAP 7.53。 本次更新的內容較多,主要內容包括:Open SQL更名為ABAP SQL;新函式和表示式;限制移除;table buffer增強;更嚴格的語法檢查規則等。 本文是更新文件中ABAP SQL的部分的翻譯。 譯者水平有限,如有錯誤

Oracle12C】部署服務建立用戶及建庫建表遇到的問題以及12C的一些特性

Oracle問題這是一篇oracle小白的不堪折磨,苦苦掙紮所作,所費心血頗深。 Oracle12C與11g版本的差異 在創建用戶時遇到一個問題(我的發現都是根據遇到的問題來研究的):問題描述:在創建服務所需用戶時提示ORA-65096:公用用戶名或角色無效。問題原因:根據Oracle官方文檔得知,12C版本

Oracle12c RAC功能增強特性ASM&Grid

網格 配置方法 改變 節點配置 root ext crc RM IT 1. 自動存儲管理(ASM)方面的增強 1.1. Flex ASM 在典型的網格架構安裝中,每個節點有自己的ASM實例運行並扮演該節點上數據庫的存儲容器的角色,對這種安裝配置,存在單點失敗的

Oracle12c多宿主容器數據庫(CDBs)和可插拔數據庫(PDBs)特性運行腳本

error local app tab OS ecif lora cron lis 對開發者和DBA們來說,對shell腳本批量任務的影響成了多宿主選項帶來的最大改變之一。因為多宿主環境通過服務來連接到可插拔數據庫,因此,依靠CRON和OS認證成了換成多宿主環境後的一

Oracle12c容錯&性能特性表空間組

size path 臨時 pac dbf 包含 amp lec 空間名 1. 簡介 表空間組可以使用戶消耗來自多個表空間的臨時表空間。表空間組有如下特點: 1) 至少包含一個表空間。表空間組中包含的最大表空間數沒有限制。 2)

【小家java】java8特性---外部迭代和內部迭代對比效能差異

相關閱讀 從一個案例開始:遍歷一個集合 外部迭代 最傳統的方法是用Iterator,當然還以用for i、增強for迴圈等等。這一類方法叫做外部迭代,意為顯式地進行迭代操作,即集合中的元素訪問是由一個處於集合外部的東西來控制的,在這裡控制著迴圈的東西就是

PHP類的繼承特性方法的過載覆蓋

<?php/*類的繼承特性之過載(也叫覆蓋): 1.說的意思指的是子類可以重新定義一個和父類相同名字的方法,從而覆蓋掉原來父類的方法,加上自己新新增的功能; 2.若原封不動的覆蓋容易造成程式碼的

SQL Insert into 語句插入後返回插入的自動增長ID

這裡分兩種情況, 第一儲存過程中插入,插入後使用 SET @[email protected]@IDENTITY 這個是一個全域性變數,可以返回新插入的自動增長ID,然後在Out put出來就可以了。 第二種,在程式碼中執行Insert 語句 這種做法在

JDK5特性線程同步工具類

string 兩個人 exec random 主線程 一個人 exce print exchange 一. Semaphore Semaphore能夠控制同一時候訪問資源的線程個數, 比如: 實現一個文件同意的並發訪問數. Semaphore實現的功能就類似廁全部5個坑

Oracle 12C 特性擴展數據類型extended data type

stand 特性 standard ava dbm har sco stat rac Oracle 12C 新特性-擴展數據類型,在12c中,與早期版本相比,諸如VARCHAR2, NAVARCHAR2以及 RAW這些數據類型的大小會從4K以及2K字節擴展至32K字節。只要

ActiveMQ22:Consumer高級特性消息分組Message Groups

jms message groups activemq 一、簡介Message Groups就是對消息分組,它是Exclusive Consumer功能的增強。邏輯上,Message Groups 可以看成是一種並發的Exclusive Consumer。跟所有的消息都由唯一的consumer處理

ActiveMQ24:Consumer高級特性Slow Consumer Handling慢消費者的處理

jms activemq slow consumer handling 慢消費者的處理 一、Prefetch機制ActiveMQ通過Prefetch機制來提高性能,方式是在客戶端的內存裏可能會緩存一定數量的消息。緩存消息的數量由prefetch limit來控制。當某個consumer的pre

Oracle12c功能增強特性維護&amp;升級&amp;恢復&amp;數據泵等

特點 back director spl 診斷 art 同步 value transform 1. 內容提要 1) 表分區維護的增強。 2) 數據庫升級改善。 3) 跨網絡還原/恢復數據文件。 4) 數據泵的增強。 5) 實時ADDM。 6)

ROS知識16----如何編譯時自動鏈接同一個工作空間的其他包的頭文件包含message,srv,action自動生成的頭文件

logs package fin 空間 依賴庫 osc div build 知識 catkin_make編譯時,往往需要自動鏈接同一個工作空間的其他包的頭文件。否則會出現類似如下的錯誤: /home/xx/xx_ws/srcA_package/src/db.hpp:13: