1

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

但是,我无法让 ACCEPTED = YES 工作。根据文档,您需要 ENABLED 和 ACCEPTED 两者。

我试图“发展”基线,但 OEM 抱怨(通过报告)它差了 1.06 倍。但这不是真的。

另外我想知道如何确保它不会随着时间的推移自动清除,这就是它的固定。谢谢!

4

1 回答 1

4

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

SELECT * FROM dba_sql_plan_baselines

考虑具有最低成本或最佳运行时间的计划基线。优化器将选择成本最低的可接受计划,但会优先选择固定计划。这是保证 CBO 使用计划的最佳方式,不管计划有哪些提示和 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. 再检查一遍
于 2017-01-26T12:49:24.067 回答