1. 程式人生 > >Oracle 11g 針對SQL效能的新特性(三)- SQL Plan Management

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


簡介


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


同其他方法相比,SPM更加的靈活。如我們所熟知的,一條帶有繫結變數的SQL語句,最好的執行計劃會根據繫結變數的值而不同,11g以前的方法都無法解決這個問題。在11g中,與adaptive cursor sharing配合,SPM允許你同時接受多個執行計劃。執行時,根據不同的變數值,SPM會花費很少的運算從中選擇一條最合適的。 


概念


SQL Plan Management SPM:oracle 11g 中提供的新特性,用來更好地控制執行計劃。 
Plan History: 優化器生成的所有執行計劃的總稱
SQL Plan Baseline: Plan History裡那些被標記為“ACCEPTED”的執行計劃的總稱
Plan Evolution: 把一條執行計劃從Plan History裡標記為“ACCEPTED”的過程
SQL Management Base SMB: 字典表裡儲存的執行計劃的總稱,包括Plan History,SQL Plan Baseline和SQL profile。


SPM的特點


o 與profile和outline相比,更加靈活的控制手段

  + 可以有很多的計劃被儲存下來,只有"ENABLED"並且"ACCEPTED"的執行計劃才可以被選擇。 
  + 允許有多個"ACCEPTED"的執行計劃,根據實際情況進行選擇。 
  + 可以用手工或者自動的方式,把執行計劃演化(evolve)為"ACCEPTED"。 還可以控制只讓效能更好的計劃被接受。
  + 允許設定"FIXED"的計劃。這樣其他的計劃將不會被選擇。


o SPM使計劃真正的穩定。 outline的缺點是太過死板,當資料量大幅度變化時無法做出相應的改變。 SQL proifle的缺點是,當資料量變化時,STA(SQL Tuning Advisor)會不可預知地去更改執行計劃。 而SPM則會提供幾個完整的plan供選擇。 


SPM的控制方式


SPM通過幾個標記來實現對執行計劃的控制:


o Enabled (控制活動)
  + YES (活動的,但不一定會被使用)
  + NO (可以理解為被標記刪除)
o Accepted (控制使用)
  + YES (只有 “Enabled” 並且 “Accepted” 的計劃才會被選擇使用)
  + NO (如果是“Enabled” 那麼只有被evolve成“Accepted”才有可能被執行)
o Fixed (控制優先順序)
  + YES (如果是“Enabled”並且“Accepted”,會優先選擇這個計劃,這個計劃會被視為不需要改變的)
  + NO (普通的計劃,無需優先)

另有一個被動的標記:
o Reproduced (有效性)
  + YES (優化器可以使用這個計劃)
  + NO (計劃無效,比如索引被刪除)


SPM如何捕捉執行計劃


o 自動捕捉
  1. 首先把OPTIMIZER_CAPTURE_SQL_PLAN_BASELINES設定成TRUE
  2. 從這個時刻開始,所有執行兩次以上的SQL語句會被觀測,執行計劃會進入Plan History。有個別例外的,參見note 788853.1
  3. 生成的第一個執行計劃被標記為ENABLED並且是ACCEPTED,後續的執行計劃會被標記為ENABLED但不是ACCEPTED。
  4. 這時把OPTIMIZER_CAPTURE_SQL_PLAN_BASELINES設定會FALSE,新的語句將不會建立Baseline。
  5. 需要注意的是,即使關閉了自動捕捉,針對存在baseline的SQL,由於ACS的作用,仍舊會有新的PLAN生成,新的Plan仍會進入Plan History,標記為ENABLED但不是ACCEPTED。參見“執行計劃的選擇”。 


o 批量匯入 (這些匯入的baseline都會被自動標記為ACCEPTED) 
   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


相關推薦

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

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

PHP特性效能優化

1)、為 unserialize() 提供過濾的特性:可以防止非法資料進行程式碼注入,提供了更安全的反序列化資料。 【注】所有php裡面的值都可以使用函式serialize()來返回一個包含位元組流的字串來表示。unserialize()函式能夠重新把字串變回php原來的值

SQL Server2016特性1:動態的顯示執行計劃(效果類似小視訊)

SQL Server2016種的一個新特性是 可以動態的顯示 執行計劃的過程,就像小視訊一樣的效果。 一、準備工作 在資料庫有一個表tb,資料量在8000w左右,如果資料量少了,顯示的動態過程會一閃而過。 演示的例子很簡單,就是要計算tb表的準確記錄數,程式碼如下: S

SQL Server2016特性2:時態表 Temporal Table

SQL Server 2016 引入了對版本由系統控制的臨時表的支援,其附帶的內建支援可以提供表中儲存的資料在任意時間點的相關資訊,而不僅僅是資料在當前時刻正確的資訊。 臨時表是 ANSI SQL 2011 中引入的資料庫功能。 版本由系統控制的臨時表是使用者表的一種型別,

Java8的特性

強大的Stream API 瞭解Stream Java8中有兩個最為重要的改變。第一個是Lambda表示式;另外一個則是Stream API(java.util.stream.*)。 Stream是Java8中處理集合的關鍵抽象概念,它可以指定你希望對集合進行的操作,可以執行非常複雜

Java8特性方法引用、構造器引用、陣列引用

目錄: 1、方法引用 1.1、物件 :: 例項方法 1.2、類 :: 靜態方法 1.3、類 ::例項方法 2、構造器引用 2.1、介紹 2.2、使用 3、陣列引用 3.1、介紹 3.2、使用 1、方法引用 若lambda體中的內容有方法已經實現了,

Java 8 特性的日期時間類

老日期類 一說到在Java中處理日期和時間,我們首先想到的肯定是java.util.Date類。確實,由於很多教材和文獻都比較老,所以大多數人學習Java的時候使用的都是這個類。而且這個類確實在整個Java生態中擔任過重要的作用。 但是隨著時間推移,這個類已

MQTT 5.0 特性— 有效載荷標識與內容型別

有效載荷標識(Payload Format Indicator)與內容型別(Content Type)是 MQTT 5.0 新引入

Sql Service的藝術 SQL聚合函數的應用

包括 不同 過程 接下來 日期 p s 不可 tno 函數名 SQL提供的聚合函數有求和,最大值,最小值,平均值,計數函數等。 聚合函數及其功能: 函數名稱 函數功能 SUM() 返回選取結果集中所有值的總和 MAX() 返回選取結果集中所有值的最大值 M

MySQL 8.0.2復制特性翻譯

ogl 防止 將不 地址 arc -- 等待 download 日誌 譯者:知數堂星耀隊 MySQL 8.0.2復制新特性 MySQL 8 正在變得原來越好,而且這也在我們MySQL復制研發團隊引起了一陣熱潮。我們一直致力於全面提升MySQL復制,通過引入新的和一些有趣

Java 接口 特性Java8

java7 void @override www jdk font default style static   Java8新特性之接口增強   在Java7以及以前的版本中,接口裏的方法都是抽象的,並且不存在靜態方法,屬性默認修飾符是public static final

Java8特性---Lambda表示式

Java8新特性之Lambda表示式 Lambda的語法格式 語法格式一:無引數,無返回值 語法格式二:有一個引數,並且無返回值 語法格式三:若只有一個引

php7特性:面向物件部分

1)、PHP 7 支援new class 來例項化一個匿名類這可以用來替代一些"用後即焚"的完整類定義。 2)、Closure::call():將一個閉包函式動態繫結到一個新的物件例項並呼叫執行該函式 3)、use:可以使用一個 use 從同一個 namespace 中匯入類、函

特性2---一致性初始化,使用者自定義初值列

一致性初始化 引入原因 在沒有引入之前,變數的初始化有許多方式 (如小括號,大括號,賦值號),且不同變數和類又有不同的初始化方式。(如,結構體能用{}初始化,類用{}則會出錯。) int i=1; int i(1); int i = int(1); test

特性4---Foreach,String Literal

Foreach foreach是新引入的一種for迴圈形式,常見語法如下: decl是coll集合中每個元素的宣告 for(decl: coll) { //run } for的轉換 對於集合種提供成員函式如begin(),或者end()等產生的foreach如下

特性3---move語義

move語義 左值和右值 在說move語義之前,不得不說的是左值和右值。 通俗簡單點的講左值和右值通過是否在記憶體中有空間來分類。左值是在記憶體空間實體如(變數和函式等),而相反的沒有空間的為右值如臨時物件。 int a=1;//a為左值,1為右值 int *p = &

Java8的特性

並行流與序列流 什麼是並行流 我們先了解一下什麼是Fork/Join框架 Fork/Join框架和傳統的執行緒池的區別 應用Fork/Join計算100000000的和: public class ForkJoinCalculate extends

Java8的特性

四大內建核心函式式介面 Java8 內建的四大核心函式式介面 Consumer : 消費型介面 --> void accept(T t); Supplier : 供給型介面 -->T get(); Function<T, R> : 函式型介

C++11 帶來的特性 2—— 統一初始化Uniform Initialization

1 統一初始化(Uniform Initialization) 在C++ 11之前,所有物件的初始化方式是不同的,經常讓寫程式碼的我們感到困惑。C++ 11努力創造一個統一的初始化方式。 其語法是使用{}和std::initializer_list ,先看示例。 int values[

C++11 帶來的特性 3—— 關鍵字noexcept

1 關鍵字noexcept 從C++11開始,我們能看到很多程式碼當中都有關鍵字noexcept。比如下面就是std::initializer_list 的預設建構函式,其中使用了noexcept。 constexpr initializer_list() noexcept