固定、禁用或删除 SQL plan baseline 计划
Oracle性能命令
-- Show the plan content:
SELECT *
FROM TABLE(DBMS_XPLAN.DISPLAY_SQL_PLAN_BASELINE(
sql_handle => '<sql_handle>',
plan_name => '<plan_name>',
format => 'TYPICAL'));
SET SERVEROUTPUT ON
DECLARE
n PLS_INTEGER;
BEGIN
-- FIXED: this plan is preferred, new plans are not evolved automatically
n := DBMS_SPM.ALTER_SQL_PLAN_BASELINE(
sql_handle => '<sql_handle>', plan_name => '<plan_name>',
attribute_name => 'fixed', attribute_value => 'YES');
-- Take the bad plan out of use (without dropping it):
n := DBMS_SPM.ALTER_SQL_PLAN_BASELINE(
sql_handle => '<sql_handle>', plan_name => '<bad_plan_name>',
attribute_name => 'enabled', attribute_value => 'NO');
END;
/
-- Drop one plan or the SQL's entire baseline:
DECLARE
n PLS_INTEGER;
BEGIN
n := DBMS_SPM.DROP_SQL_PLAN_BASELINE(sql_handle => '<sql_handle>', plan_name => '<plan_name>');
-- without plan_name, all plans of the SQL are dropped:
-- n := DBMS_SPM.DROP_SQL_PLAN_BASELINE(sql_handle => '<sql_handle>');
DBMS_OUTPUT.PUT_LINE(n || ' plan(s) dropped');
END;
/作用
管理 baseline 计划属性:FIXED 计划优先于其他已接受计划,并停止对新计划的自动演进;ENABLED=NO 禁用计划但不删除;DROP 将其永久删除。
适用场景
为关键 SQL 牢固锁定计划、禁用误接受的坏计划,或清理不再需要的 baseline。
注意
需要 Enterprise Edition。FIXED 计划可能随数据增长而劣化,并阻止优化器使用更好的计划;请定期审查。所有计划均为 ENABLED=NO 的 SQL 将被自由优化。DROP 不可逆;请先用 DBMS_SPM.PACK_STGTAB_BASELINE 备份到暂存表。