OceanBase 執(zhí)行計(jì)劃管理

2021-06-30 11:24 更新

SQL Plan Management(SPM)是一種穩(wěn)定執(zhí)行計(jì)劃、控制計(jì)劃演進(jìn)的機(jī)制,確保新生成的計(jì)劃在經(jīng)過驗(yàn)證后才能使用,保證計(jì)劃性能朝好的方向不斷更新。

SPM 基于 SQL Plan Baseline 實(shí)現(xiàn),SQL Plan Baseline 是執(zhí)行計(jì)劃的一個(gè)基線,持久化存儲(chǔ)已經(jīng)驗(yàn)證過的執(zhí)行計(jì)劃的信息(outline_data 等信息),每個(gè)執(zhí)行計(jì)劃可對(duì)應(yīng)一個(gè) Plan Baseline,通過該 Plan Baseline 可復(fù)現(xiàn)一個(gè)執(zhí)行計(jì)劃。

SPM 包含如下過程:

  1. 計(jì)劃捕獲。

    對(duì)于新生成的計(jì)劃,如果 SQL Plan Baseline 為空,則直接加入 SQL Plan Baseline,否則通過演進(jìn)驗(yàn)證新生成計(jì)劃比 SQL Plan Baseline 中計(jì)劃性能更優(yōu)后加入 SQL Plan Baseline,并刪除舊的 Plan Baseline。

  2. 計(jì)劃演進(jìn)。

    相同 SQL 新捕獲的計(jì)劃如果和 SQL Plan Baseline 中計(jì)劃不一樣,則通過流量灰度驗(yàn)證新計(jì)劃性能是否比以前驗(yàn)證過的計(jì)劃更優(yōu)。如果更優(yōu),則將新計(jì)劃加入 SQL Plan Baseline,并執(zhí)行新計(jì)劃,否則仍使用舊計(jì)劃。

  3. 計(jì)劃選擇。

    在優(yōu)化器新生成計(jì)劃時(shí),會(huì)查看 SQL Plan Baseline 是否有已驗(yàn)證的計(jì)劃,如果有,則優(yōu)先使用已驗(yàn)證計(jì)劃,新計(jì)劃需要通過演進(jìn)驗(yàn)證后再使用。

SPM 的系統(tǒng)變量

SPM 使用如下系統(tǒng)變量和系統(tǒng)包對(duì)執(zhí)行計(jì)劃進(jìn)行管理:

系統(tǒng)變量

取值

解釋

optimizer_capture_sql_plan_baselines

true

對(duì)于新生成的計(jì)劃,如果該 SQL 沒有對(duì)應(yīng)的 Plan Baseline,則將該計(jì)劃加入到 SQL Plan Baseline;如果已有 Plan Baseline 且與新計(jì)劃不同,則會(huì)觸發(fā)計(jì)劃演進(jìn)進(jìn)行驗(yàn)證,確定是否需要將新計(jì)劃替換老的 Plan Baseline。

false

再自動(dòng)捕獲新計(jì)劃到 Plan Baseline 中。

optimizer_use_sql_plan_baselines

true

在新生成計(jì)劃時(shí),優(yōu)化器會(huì)優(yōu)先使用 Plan Baseline 計(jì)劃,對(duì)于新的不同計(jì)劃則驗(yàn)證后通過后才使用。

false

在新生成計(jì)劃時(shí),不在考慮 Plan Baseline 中計(jì)劃,直接使用優(yōu)化器新生成計(jì)劃并執(zhí)行。

設(shè)置說明如下:

optimizer_capture_sql_plan_baselines 的取值

optimizer_use_sql_plan_baselines 的取值

說明

True

True

計(jì)劃捕獲和演進(jìn)均打開,優(yōu)化器會(huì)使用 Plan Baseline 計(jì)劃。

True

False

Plan Baseline 中無計(jì)劃時(shí)會(huì)捕獲計(jì)劃到 Plan Baseline,不演進(jìn),優(yōu)化器不考慮 Plan Baseline 計(jì)劃,使用新生成計(jì)劃。

False

True

不捕獲計(jì)劃到 Plan Baseline, 優(yōu)化器會(huì)使用 Plan Baseline 計(jì)劃,如果 SQL Plan Baseline 沒有對(duì)應(yīng)計(jì)劃,則使用新生成計(jì)劃。

False

False

不捕獲計(jì)劃,不演進(jìn),優(yōu)化器不使用 Plan Baseline 計(jì)劃,使用新生成的計(jì)劃。

DBMS_SPM

DBMS_SPM 是用于操作 SPM 的命令包,可支持加載、更改以及刪除 Plan Baseline 信息。

LOAD_PLANS_FROM_CURSOR_CACHE

LOAD_PLANS_FROM_CURSOR_CACHE 用于將 plan cache 中執(zhí)行計(jì)劃對(duì)應(yīng)的 Plan Baseline 信息加載到 _ _all_tenant_plan_baseline 表中。語法如下:

說明 
_ _all_tenant_plan_baseline 為 OceanBase 數(shù)據(jù)庫內(nèi)部表。
DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE (
   sql_id            IN  VARCHAR2,
   plan_hash_value   IN  NUMBER   := NULL,
   fixed             IN  VARCHAR2 := 'NO',
   enabled           IN  VARCHAR2 := 'YES')
 RETURN PLS_INTEGER;

參數(shù)解釋如下:

參數(shù)

解釋

sql_id

SQL 的唯一標(biāo)識(shí)。

plan_hash_value

plan 的唯一標(biāo)識(shí)。如果為空,則處理 sql_id 下的所有計(jì)劃。

fixed

加入到 SQL Plan Baseline 后是否將該計(jì)劃固化。固化后以后優(yōu)化器會(huì)直接選擇該計(jì)劃,不再捕獲和演進(jìn)計(jì)劃。

enabled

優(yōu)化器是否可以使用該 Plan Baseline。

如下例所示:

DECLARE
  v_load_plans number;
BEGIN
  v_load_plans := DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE(
     sql_id => '529F6E6454EF579C7CC265D1F6131D70',
     plan_hash_value => 13388268709115914355);
END;
/

ALTER_SQL_PLAN_BASELINE

ALTER_SQL_PLAN_BASELINE 用于修改 Plan Baseline 中某些屬性。語法如下:

DBMS_SPM.ALTER_SQL_PLAN_BASELINE ( 
   sql_handle        IN VARCHAR2 := NULL,
   plan_name         IN VARCHAR2 := NULL,
   attribute_name    IN VARCHAR2,
   attribute_value   IN VARCHAR2)
 RETURN PLS_INTEGER;

參數(shù)解釋如下:

參數(shù)

解釋

sql_handle

SQL 的唯一標(biāo)識(shí)。先用 sql_id 代替。

plan_name

plan 的唯一標(biāo)識(shí)。先使用 plan_hash_value 代替。

attribute_name

需要更改的字段名。OceanBase 數(shù)據(jù)庫支持修改 enabled 和 fixed 字段。

attribute_value

更改后的值。

如下示例所示,將某個(gè) Plan Baseline 固化后該 SQL 僅使用該計(jì)劃:

DECLARE
  v_alter_plans number;
BEGIN
  v_alter_plans := DBMS_SPM.ALTER_SQL_PLAN_BASELINE(
     sql_handle => '529F6E6454EF579C7CC265D1F6131D70',
     plan_name => '3388268709115914355',
     attribute_name => 'fixed',
     attribute_value => 'YES' );
END;
/

DROP_SQL_PLAN_BASELINE

DROP_SQL_PLAN_BASELINE 用于刪掉某個(gè) Plan Baseline。語法如下:

DBMS_SPM.DROP_SQL_PLAN_BASELINE (
   sql_handle     IN VARCHAR2 := NULL,
   plan_name      IN VARCHAR2 := NULL)
RETURN PLS_INTEGER;

示例如下:

DECLARE
  v_drop_plans number;
BEGIN
  v_drop_plans := DBMS_SPM.DROP_SQL_PLAN_BASELINE(
     sql_handle => '529F6E6454EF579C7CC265D1F6131D70',
     plan_name => '3388268709115914355' );
END;
/
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)