如何强制接受SQL计划基线



在Oracle中(在Oracle Enterprise Manager中查看),我有一个特定的SQL Plan Baseline,它设置为Enabled=YES。

然而,我无法让ACCEPTED=YES工作。根据文档,您需要同时启用和接受。

我试图"发展"基线,但OEM(通过一份报告)抱怨它差了1.06倍。但事实并非如此。

此外,我想知道如何确保它不会随着时间的推移而自动清除,这就是它的修复方法。谢谢

若要启用基线使用,optimizer_use_sql_plan_baselines必须为true。

SELECT * FROM dba_sql_plan_baselines

考虑一个具有最低成本或最佳运行时间的计划基线。优化器将选择成本最低的可接受计划,但会优先选择固定计划。这是保证国会预算办公室使用计划的最佳方式,无论计划有什么提示和SQL配置文件。

使用加载的基线,然后从dba_sql_plan_baselines视图获取sql句柄。

尝试使用来发展

SET LONG 10000
SELECT DBMS_SPM.evolve_sql_plan_baseline(sql_handle => 'SQL_handle_xxxxxx') FROM dual;
var report clob;
exec :report := dbms_spm.evolve_sql_plan_baseline();
print :report

只有当更多的计划可用时,计划的演变才会奏效。

有时您需要修复以强制设置基线,例如:

SET SERVEROUTPUT ON
DECLARE
l_plans_altered  PLS_INTEGER;
BEGIN
l_plans_altered := DBMS_SPM.alter_sql_plan_baseline(
sql_handle      => 'SQL_handle_xxxxxx',
plan_name       => 'SQL_PLAN_xxxxxxx',
attribute_name  => 'fixed',
attribute_value => 'YES');
DBMS_OUTPUT.put_line('Plans Altered: ' || l_plans_altered);
END;
/

通常该计划不会立即使用,有各种方法可以尝试并强制执行…

一种是如果可行的话,终止所有运行该语句的会话。

您也可以使用以下表格使光标无效:

begin
dbms_stats.gather_table_stats(ownname=> '<schema>',
tabname=> '<table>', no_invalidate => FALSE);
end;

使用旧方法进行分析也会使光标无效!

SQL> analyze table <table> estimate statistics sample 1 percent;

检查:

SQL> select child_number, executions, parse_calls, loads, invalidations 
from v$sql where sql_id = '<SQLID>';

事件顺序:

  1. 锁定用户
  2. 使光标无效
  3. 终止以该用户身份登录的所有会话
  4. 解锁用户
  5. 再次检查

最新更新