15 sql base line 工作机制
生活随笔
收集整理的這篇文章主要介紹了
15 sql base line 工作机制
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
<個人Configuration>正常配置一下, 就OK了, 不用理了, oracle 11g 默認啟動
發展:1、從Oracle的發展角度來看,估計這種方法是Oracle發展和改進的方向,如今outline已經被廢棄,sql profile估計在后續的發行版本中也難有改進,因此,對于從11g開始接觸Oracle的朋友來說,一定要對sql計劃基線有所了解,因為這是以后的主流!2、SQL執行計劃基線保存在數據字典中,查詢優化器會自動判斷使用他們。工作機制從Oracle 11g開始,由于基線的存在,一條語句的解析過程大概如下:1.SQL語句被硬解析后,CBO(優化器)會產生很多個的執行計劃,CBO從中選擇一個成本最低執行計劃。2.基于SQL語句的文本形成一個哈希值(signature),通過這個哈希值來檢查數據字典中是否存在同樣的基線。3.如果基線存在,優化器會對剛剛產生的執行計劃和保存在SQL plan baseline中的執行計劃進行比較。4.如果基線中有與CBO剛產生的執行計劃的匹配的SQL執行計劃存在,并且被標記為可接受(‘accepted’),則這個CBO生成的執行計劃被啟用。5.如果基線中沒有匹配的SQ執行計劃存在,CBO評估基線中被標記為‘accepted’的的多個執行計劃,并選擇其中cost最低的執行計劃。(注意,一個語句的基線可以有多個執行計劃被保存,這是與其他Outline和SQL profiel都不同的地方)6.如果剛剛硬解析過程中CBO選擇的執行計劃比保存在基線中的執行計劃COST都低,這個新生成的執行計劃被標記為‘not-accepted’并保存在基線中。直到這個執行計劃被演化且驗證后才會被考慮使用,即標記為accepted(演化和驗證,可以簡單理解為Oracle確認這個執行計劃可以帶來更好的性能)。Oracle 就是通過上面這種方式來確保SQL語句的性能不會退化(即第一部分中我歸納的第二個主要作用),稱為“執行計劃保守選擇策略”基線的一些特點1.通過OPTIMIZER_USE_SQL_PLAN_BASELINE來控制Oracle是否使用基線,默認值為TRUE,即會自動使用基線。2.11g中默認是不會自動創建基線3.與OUTLINE和SQL Profile不同,基線中不存在分類的概念4.與OUTLINE和SQL Profile不同,每個SQL語句可以有多個基線。Oracle根據制定的規則來判斷具體是否哪個基線5.基線針對RAC中所有的實例都生效6.基線有兩個表示,一個為sql_handle,可以理解為表示語句文本的唯一標識,一個為sql_plan_name可以理解為執行計劃的唯一標識7.不能像sql profile一樣通過force_matching屬性將字面值不一樣的SQL語句使用一個基線應用多個語句。創建基線的幾種方式1、自動捕獲基線,通過將optimizer_cature_sql_plan_baselines設置為true,優化器為重復執行兩次以上的SQL語句生成并保存基線(可以系統級或會話級修改)2、從SQL調優集合中加載,通過使用包dbms_spm.load_plans_from_sqlset來從SQL調優集合中加載基線DECLAREl_plans_loaded PLS_INTEGER; BEGINl_plans_loaded := DBMS_SPM.load_plans_from_sqlset(sqlset_name => 'my_sqlset');END;/3、從庫緩存中加載,通過包dbms_spm.load_plans_from_cursor_cache函數為一條已經在游標緩存中的語句創建基線DECLAREl_plans_loaded PLS_INTEGER;BEGINl_plans_loaded := DBMS_SPM.load_plans_from_cursor_cache(sql_id => '1fkh93md0802n',plan_hash_value=>null);END;/備注:可以有多種方式加載,例如可以根據sql文本進行模糊匹配、SQL語句解析的用戶名等等方式,具體見文檔基線的幾種狀態一個SQL語句對應的基線,我將它們歸納為三種狀態1.accepted(可接受),只有這種狀態的基線,優化器才會考慮此基線中的執行計劃2.no-accepted(不可接受),這種狀態的基線,優化器在SQL語句解析期間不會考慮。這種狀態的基線必須通過演化和驗證通過后,轉變為accepted狀態后,才會被優化器考慮使用3.fixed為yes(固定),這種狀態的基線固有最高優先級!比其他兩類基線都要優先考慮查看基線1、基本視圖:dba_sql_plan_baselines、dba_sql_management_config2、底層視圖:sqlobj$data 、 sqlobj$ (保存具體的hint),如下查看基線中保存的執行計劃語句:selectextractvalue(value(d), '/hint') as outline_hintsfromxmltable('/outline_data/hint'passing (selectxmltype(comp_data) as xmlvalfromsqlobj$data sod, sqlobj$ sowhere so.signature = sod.signatureand so.plan_id = sod.plan_idand comp_data is not nulland name like '&baseline_plan_name')) d;3、通過函數來查看基線的詳細信息:select * from table(dbms_xplan.display_sql_plan_baseline(sql_handle=>'SYS_SQL_11bcd50cd51504e9',plan_name=>'SQL_PLAN_13g6p1maja1790cce5f0e'));演化基線 為了驗證基線中一個處于不可接受狀態的執行計劃是否比一個處于可接受狀態的執行計劃具有更高的效率,必須通過演化來驗證,需要讓優化器以不同的執行計劃來執行這條SQL語句,觀察不可接受狀態的執行計劃基線是否會帶來更好的性能,如果性能確實更高,這個不可接受狀態的基線將會轉換為可接受狀態。演化的方式有兩種:1、手工執行運行SELECT DBMS_SPM.evolve_sql_plan_baseline(sql_handle => 'SYS_SQL_xxxxxxxxxxxxx') From dual;還有time_limit/verify/commit幾個參數,可以參考文檔2、調優包實現基線的自動演化,可以理解為,啟動一個調度任務,周期性的檢查是否有不可接受狀態的基線可以被演化 修改基線可以通過dbms_spm.alter_sql_plan_baseline包來修改基線的一些屬性,主要有如下幾個屬性1.ENABLED :設置該屬性的值為NO告訴Oracle 11g臨時禁用某個計劃,一個SQL計劃必須同時標記為ENABLED和ACCEPTED,否則CBO將忽略它2.FIXED:設置為YES,那個計劃將是優化器唯一的選擇[最高優先級],即使如果某個計劃可能擁有更低的成本。這讓DBA可以撤銷SMB的默認行為,對于轉換一個存儲概要進入一穩定的SQL計劃基線特別有用,注意當一個新計劃被添加到被標記為FIXED的SQL計劃基線,該新計劃不能被利用除非它申明為FIXED狀態3.AUTOPURG:設置這個屬性的值為NO告訴Oracle 11g無限期保留它,從而不用擔心SMB的自動清除機制4.plan_name : 改變SQL plan 名字5.description : 改變SQL plan描述語法:SET SERVEROUTPUT ONDECLAREv_text PLS_INTEGER;BEGINv_text := DBMS_SPM.alter_sql_plan_baseline(sql_handle => 'SYS_SQL_xxxxxx',plan_name => 'SYS_SQL_PLAN_xxxxxxxxx',attribute_name => 'fixed',attribute_value => 'YES');DBMS_OUTPUT.put_line('Plans Altered: ' || v_text );END;/
?
轉載于:https://www.cnblogs.com/moveofgod/p/4660523.html
總結
以上是生活随笔為你收集整理的15 sql base line 工作机制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Scrollview+ListView冲
- 下一篇: 依赖包的添加和自动检测机制