OceanBase 執(zhí)行計劃管理

2021-06-30 11:24 更新

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

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

SPM 包含如下過程:

  1. 計劃捕獲。

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

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

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

  3. 計劃選擇。

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

SPM 的系統(tǒng)變量

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

系統(tǒng)變量

取值

解釋

optimizer_capture_sql_plan_baselines

true

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

false

再自動捕獲新計劃到 Plan Baseline 中。

optimizer_use_sql_plan_baselines

true

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

false

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

設(shè)置說明如下:

optimizer_capture_sql_plan_baselines 的取值

optimizer_use_sql_plan_baselines 的取值

說明

True

True

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

True

False

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

False

True

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

False

False

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

DBMS_SPM

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

LOAD_PLANS_FROM_CURSOR_CACHE

LOAD_PLANS_FROM_CURSOR_CACHE 用于將 plan cache 中執(zhí)行計劃對應(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)識。

plan_hash_value

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

fixed

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

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)識。先用 sql_id 代替。

plan_name

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

attribute_name

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

attribute_value

更改后的值。

如下示例所示,將某個 Plan Baseline 固化后該 SQL 僅使用該計劃:

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 用于刪掉某個 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)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號