W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
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 包含如下過程:
計劃捕獲。
對于新生成的計劃,如果 SQL Plan Baseline 為空,則直接加入 SQL Plan Baseline,否則通過演進(jìn)驗證新生成計劃比 SQL Plan Baseline 中計劃性能更優(yōu)后加入 SQL Plan Baseline,并刪除舊的 Plan Baseline。
計劃演進(jìn)。
相同 SQL 新捕獲的計劃如果和 SQL Plan Baseline 中計劃不一樣,則通過流量灰度驗證新計劃性能是否比以前驗證過的計劃更優(yōu)。如果更優(yōu),則將新計劃加入 SQL Plan Baseline,并執(zhí)行新計劃,否則仍使用舊計劃。
計劃選擇。
在優(yōu)化器新生成計劃時,會查看 SQL Plan Baseline 是否有已驗證的計劃,如果有,則優(yōu)先使用已驗證計劃,新計劃需要通過演進(jìn)驗證后再使用。
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 是用于操作 SPM 的命令包,可支持加載、更改以及刪除 Plan Baseline 信息。
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 用于修改 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 用于刪掉某個 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號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: