1. 程式人生 > >Oracle SPM(SQL Plan Management)介紹及演示SQL

Oracle SPM(SQL Plan Management)介紹及演示SQL

Oracle優化器輔助手段的發展

  • Oracle 8:hint
  • Oracle 8i&9: stored outline
  • Oracle 10: sql profile
  • Oracle 11: sql plan manangement

優化器可能選擇到很差的Plan。

RBO->CBO 由規則序列生成執行計劃,向著智慧靈活化發展,根據資料物件的統計資訊進行執行計劃生成,根據cost選擇最優。

但是CBO依賴統計資訊,統計量又不能和資料表資料完全同步,當統計資訊與實際資料差距大就會導致錯誤執行計劃生成。

(1)沒有定期收集統計量的方案,使得統計量過舊;

(2)當系統升級移植,版本不一致使得匯入的對應統計量錯誤;

(3)在夜間剛剛收集完統計量之後呼叫大作業,匯入海量資料直接改變了原有的資料分佈情況。第二天直接生成錯誤的執行計劃。

Oracle SPM 主要元件

  • Plan Capture 捕獲

儲存SQL對應Plan的相關資訊。這些資訊可以唯一確定一個plan。

  • Plan selection 選擇

在系統的執行時,Oracle要保證每次執行SQL的執行計劃都是使用SQL Baseline中的確定執行計劃。同時,跟蹤所有該statement執行中生成的新執行計劃,作為Plan Histroy資訊儲存下來。

  • Plan evolution 進化

新增新的plan到SQL baselines中,自動或手動。

通過使用baseline,減少效能回退。可以為新應用生成baselines,逐步演化更好的plan。

Plan Capture

自動捕捉 Automatic Initial Plan Capture

這裡寫圖片描述

  1. 首先把OPTIMIZER_CAPTURE_SQL_PLAN_BASELINES設定成TRUE

  2. 從這個時刻開始,所有執行兩次以上的SQL語句會被觀測,執行計劃會進入Plan History。

  3. 生成的第一個執行計劃被標記為ENABLED並且是ACCEPTED,後續的執行計劃會被標記為ENABLED但不是ACCEPTED。

  4. 這時把OPTIMIZER_CAPTURE_SQL_PLAN_BASELINES設定會FALSE,新的語句將不會建立Baseline。

  5. 需要注意的是,即使關閉了自動捕捉,針對存在baseline的SQL,仍舊會有新的PLAN生成,新的Plan仍會進入Plan History,標記為ENABLED但不是ACCEPTED。

手動匯入 Manual Plan Capture

這裡寫圖片描述

Oralce提供四種方式把計劃匯入到sql plan baseline中。

  • 從 SQL Tuning Set STS 導DBMS_SPM.LOAD_PLANS_FROM_SQLSET

  • 從Stored Outlines 中匯入DBMS_SPM.MIGRATE_STORED_OUTLINE

  • 從記憶體中存在的計劃中匯入DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE;

  • 通過staging table從另外一個系統中移植

    DBMS_SPM.CREATE_STGTAB_BASELINE

    DBMS_SPM.PACK_STGTAB_BASELINE

    DBMS_SPM.UNPACK_STGTAB_BASELINE

(這些匯入的baseline都會被自動標記為ACCEPTED)

Plan Selection

這裡寫圖片描述

OPTIMIZER_USE_SQL_PLAN_BASELINES被設定成預設值TRUE,SQl Plan Baseline就會起作用。

過程:

  • 首先,無論是否存在baseline,oracle都會正常進行硬解析或者軟解析,為SQL生成一個執行計劃。 由於ACS和bind peeking的作用,存在baseline的SQL有可能在這時生成一個不同於baseline的執行計劃。

  • 如果baseline不存在,就按生成的計劃執行。如果baseline存在,那麼要檢視history裡是否有這個計劃,如果沒有,就將這個計劃插入,並標記為ENABLED,NON-ACCEPTED。

  • 在baseline中檢視是否有FIXED的計劃存在,如果存在,執行FIXED的計劃,如果存在多個FIXED的計劃,根據統計資訊重新計算cost,選擇cost小的那個。

  • 如果FIXED的計劃不存在,就選擇ACCEPTED的計劃執行。 如果存在多個ACCEPTED的計劃,根據統計資訊重新計算cost,選擇cost小的那個。

注意這裡每次重新計算cost的代價不大,因為執行計劃是已知的,優化器不必遍歷所有的可能,只需根據演算法計算出已知計劃的cost便可。

Plan Evolution

這裡寫圖片描述

執行計劃的演化指Plan History裡的執行計劃從NON-ACCEPTED,變成ACCEPTED的過程。 如果上所述,由於ACS和Bind Peeking的作用,存在baseline的SQL有可能生成新的執行計劃,被儲存到Plan History中。 Oracle提供了API,通過自動或手工的方式,將一個計劃標記為ACCEPTED,這個計劃就會被後續的執行所選擇。有自動和手動兩種方式,見後面的演示。

演示

Table Prepare

create table yz as select rownum as c1, trunc(dbms_random.value(0, 1000)) as c2 from dual connect by level <= 5000;

Automatic Initial Plan Capture

show parameter capture_sql_plan;

1、alter session set optimizer_capture_sql_plan_baselines=TRUE;  (or alter system set optimizer_capture_sql_plan_baselines=TRUE;)
開啟自動capture sql plan
2、select * from yz where c1= ?; (改一下值) select * from yz where c1 = 1;
執行SQL語句
3、select signature, sql_handle, sql_text,PLAN_NAME,ORIGIN,version, ACCEPTED from dba_sql_plan_baselines where sql_text like ‘select * from yz where c1 = ?’;
檢視dba_sql_plan_baselines
 4、select * from table(dbms_xplan.display_sql_plan_baseline(sql_handle => 'SYS_SQL_c748bdb0d9540dcb', plan_name => 'SQL_PLAN_cfk5xq3cp83fb97bbe3d0'));
檢視baseline中的plan。

Manual Plan Capture

從library cache拿
1、alter session set optimizer_capture_sql_plan_baselines=false;
先關掉自動捕獲。
2、select * from yz where c2 = ?;
執行一條語句
3、select sql_handle, sql_text,PLAN_NAME,ORIGIN,version, ACCEPTED from dba_sql_plan_baselines where sql_text like 'select * from yz%';
可以看到dba_sql_plan_baselines中不存在
4、  select sql_text, sql_id, plan_hash_value from v$sql where sql_text like 'select * from yz where c2 = ?';

找到sql_id和plan_hash_value

5、SQL>  var i number;
SQL> exec :i := dbms_spm.load_plans_from_cursor_cache (sql_id=>'bg9cppxy2a7fx', plan_hash_value=>'1357081020');
將cursor cache中的plan加入到spm中

6、select sql_handle, sql_text,PLAN_NAME,ORIGIN,version, ACCEPTED from dba_sql_plan_baselines where sql_text like 'select * from yz%';
新的plan 加入baselines中

Plan Selection
1、select name,ISSES_MODIFIABLE, ISSYS_MODIFIABLE, ISINSTANCE_MODIFIABLE  from v$parameter where name like 'optimizer_use_sql_plan%';
檢視是否使用baseline
2、select * from yz where c1 = ?;
執行已經加入baseline的sql.

3、select * from table(dbms_xplan.DISPLAY_CURSOR(null, null, 'advanced'));
或者
 select sql_id, sql_text, PLAN_HASH_VALUE, executions, child_number from v$sql where sql_text like '';
select * from table(dbms_xplan.display_cursor('sql_id',null,'ADVANCED ALLSTATS LAST PEEKED_BINDS'));

4、select sql_handle, sql_text,PLAN_NAME, ACCEPTED, enabled, executions from dba_sql_plan_baselines where sql_text like 'select * from yz%';
檢視executions是不是顯示被執行過

Plan Evolution
create index yz_c1 on yz(c1);
select * from yz where c1 = ?;
select * from table(dbms_xplan.DISPLAY_CURSOR(null, null, 'advanced'));
自動
select DBMS_SPM.EVOLVE_SQL_PLAN_BASELINE(sql_handle => NULL,  plan_name  => NULL, verify => 'YES',  commit => 'YES' ) from dual;
這裡由兩個標記控制:
o Verify 
  + YES (只有效能更好的計劃才會被演化)
  + NO (演化所有的計劃)
o Commit
  + YES (直接演化)
  + NO (只生成報告)
select sql_handle, sql_text,PLAN_NAME, ACCEPTED, enabled, executions from dba_sql_plan_baselines where sql_text like 'select * from yz%';

手動
DECLARE

 v_text  PLS_INTEGER;

BEGIN

 v_text  := DBMS_SPM.alter_sql_plan_baseline(sql_handle  => 'SYS_SQL_648e097c2d8e05a6',plan_name => 'SQL_PLAN_693h9ghqsw1d63158d001',

  attribute_name  => 'enabled',attribute_value => 'yes');

END;
/

相關推薦

Oracle SPMSQL Plan Management介紹演示SQL

Oracle優化器輔助手段的發展 Oracle 8:hint Oracle 8i&9: stored outline Oracle 10: sql profile Oracle 11: sql plan manangement 優化器可能選擇

Oracle 11g 針對SQL效能的新特性- SQL Plan Management

簡介 在Oracle 11g之前,執行計劃一直是作為“執行時”生成的物件存在。雖然oracle提供了一些方法去指導它的生成,但Oracle一直沒有試圖去儲存完整的執行計劃。 從11g開始,執行計劃就可以作為一類資源被儲存下來,允許特定SQL語句只能選擇“已知”的執行計劃。  同其他方法相比,SPM更加的靈活。

Oracle SQL執行計劃基線總結SQL Plan Baseline

為了驗證基線中一個處於不可接受狀態的執行計劃是否比一個處於可接受狀態的執行計劃具有更高的效率,必須通過演化來驗證,需要讓優化器以不同的執行計劃來執行這條SQL語句,觀察不可接受狀態的執行計劃基線是否會帶來更好的效能,如果效能確實更高,這個不可接受狀態的基線將會轉換為可接受狀態。演化的方式有兩種:

SQL Plan Management 2

在之前的Blog 裡瞭解了Oracle 11g SQL Plan Management的理論,這篇Blog來演示一些具體的操作示例。 Oracle 11g 新特性 --SQL Plan Management 說明 官網說明: Using SQL Plan Management 一. SPM

PL/SQL中查詢Oracle大數17位以上時顯示科學計數法的解決方法

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Oracle 11g 新特性 -- SQL Plan Management 示例

在之前的Blog 裡瞭解了Oracle 11g SQL Plan Management的理論,這篇Blog來演示一些具體的操作示例。 Oracle 11g 新特性 --SQL Plan Management 說明 官網說明: Using SQL Plan Managem

Oracle 11g 新特性 -- SQL Plan Management 說明

一.概述 SQL 語句的SQL 執行計劃發生更改時,可能存在效能風險。 SQL 計劃發生更改的原因有很多,如優化程式版本、優化程式統計資訊、優化程式引數、方案定義、系統設計和SQL 概要檔案建立等。 在以前版本的Oracle DB 中引入了各種計劃控制技術(如儲存的大綱

Oracle RACReal Application Clusters

同步 ati 群集 進行 重要 voting proc 客戶端 隨著 Oracle RAC 運行於集群之上,為 Oracle 數據庫提供了最高級別的可用性、可伸縮性和低成本計算能力。如果集群內的一個節點發生故障,Oracle 將可以繼續在其余的節點上運行。Or

Oracle DMLinsert,update,delete數據操縱語言

無法讀取 savepoint strong 點名 style 自動提交 erl 記錄 save   DML:數據操縱語言   1.插入數據    insert into 表名(列,列...)values(值,值...)   當插入的數據與表格一一對應時,列可以省略   

oracle安裝windows 64位

win 情況下 占用 png servers ati 完成 images lead oracle安裝11g:1.通過官網www.oracle.com下載oracle包,分別為有1和2,將兩個都解壓,後合並都一起,例如:2.安裝前需要註意:關掉病毒防火墻 保證系統是健康正常的

PHP規範PSR18HTTP客戶端介紹

本文件描述了用於傳送HTTP請求和接收HTTP響應的通用介面。 本文件中的關鍵詞“必須”,“必須”,“必需”,“應該”,“不應該”,“應該”,“不應該”,“推薦”,“可以”和“可選”按照RFC 2119中的描述進行解釋。 1 目標 此PSR的目標是允許開發人員建立與HTTP客戶端實現分離的庫

PHP規範PSR13連結定義介面介紹

在HTML上下文和各種API格式上下文中,超媒體連結正變得越來越重要。但是,沒有單一的常見超媒體格式,也沒有一種通用的方式來表示格式之間的連結。 該規範旨在為PHP開發人員提供一種簡單,通用的方式來表示超媒體連結,而不依賴於所使用的序列化格式。這反過來允許系統將具有超媒體連結的響應序列化為一種或多種

PHP規範PSR7HTTP訊息介面介紹

1.5 服務端請求 RequestInterface提供HTTP請求訊息的一般表示。但是,由於伺服器端環境的性質,伺服器端請求需要額外的處理。伺服器端處理需要考慮通用閘道器介面(CGI),更具體地說,需要考慮PHP通過其伺服器API(SAPI)對CGI的抽象和擴充套件。 PHP通過超級全域性提供

PHP規範PSR7HTTP訊息介面介紹

1.3 流 HTTP訊息由起始行,標題和正文組成。 HTTP訊息的主體可能非常小或非常大。嘗試將訊息正文表示為字串很容易消耗比預期更多的記憶體,因為正文必須完全儲存在記憶體中。嘗試將請求或響應的主體儲存在記憶體中將阻止使用該實現能夠使用大型訊息體。 StreamInterface用於在讀取或寫入

PHP規範PSR7HTTP訊息介面介紹

本文件描述了RFC 7230和RFC 7231中描述的用於表示HTTP訊息的公共介面,以及RFC 3986中描述的用於HTTP訊息的URI。 HTTP訊息是Web開發的基礎。 Web瀏覽器和HTTP客戶端(如cURL)建立傳送到Web伺服器的HTTP請求訊息,Web伺服器提供HTTP響應訊息。伺服器

PHP規範PSR1基本編碼標準介紹

標準的這一部分包括應該被認為是確保共享PHP程式碼之間高水平技術互操作性所需的標準編碼元素。 本文件中的關鍵詞“必須”,“必須”,“必需”,“應該”,“不應該”,“應該”,“不應該”,“推薦”,“可以”和“可選”按照RFC 2119中的描述進行解釋。 1、總覽 檔案必須只使用<?

利用sqoop將hive資料匯入Oracle踩的坑

教程很多,這裡只說踩過的坑 1.下載sqoop時,還得下一個bin的包,拿到sqoop-1.4.6.jar 的包,放到hadoop的lib目錄下 2.匯入oracle,執行程式碼時,使用者名稱和表名必須大寫!且資料庫建表時表名必須大寫!  示例程式碼: sqoop expo

python連線oracle亂碼環境變數設定

select userenv('language') from dual;   檢視一下資料庫字符集 客戶端 export NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS16GBK" 然後 import sys impor

CTCConnectionist Temporal Classification介紹

CTC解決什麼問題 CTC,Connectionist Temporal Classification,用來解決輸入序列和輸出序列難以一一對應的問題。 舉例來說,在語音識別中,我們希望音訊中的音素和翻譯後的字元可以一一對應,這是訓練時一個很天然的想法。但是要對齊是一件很困難的事,如下圖所示(圖源見參考資料[1

Flask ~~“一見鍾情之初體驗”flask的網頁模板介紹使用①

                                            &