W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
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 包含如下過程:
計(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。
計(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ì)劃。
計(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)變量和系統(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 是用于操作 SPM 的命令包,可支持加載、更改以及刪除 Plan Baseline 信息。
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 用于修改 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 用于刪掉某個(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;
/
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: