Oracle 如何强制接受SQL计划基线?

Oracle 如何强制接受SQL计划基线?,oracle,oracle11g,sql-execution-plan,oracle-enterprise-manager,Oracle,Oracle11g,Sql Execution Plan,Oracle Enterprise Manager,在Oracle中(在Oracle Enterprise Manager中查看这一点),我有一个特定的SQL计划基线,设置为Enabled=YES 然而,我不能让被接受的=是的工作。根据文档,您需要同时启用和接受这两个选项 我试图“进化”基线,但OEM抱怨(通过一份报告)它是基线的1.06倍。但事实并非如此 此外,我想知道如何确保它不会随着时间的推移自动清除,这是它的修复。谢谢 要启用基线使用,optimizer\u use\u sql\u plan\u基线必须为true SELECT * FRO

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

然而,我不能让被接受的=是的工作。根据文档,您需要同时启用和接受这两个选项

我试图“进化”基线,但OEM抱怨(通过一份报告)它是基线的1.06倍。但事实并非如此


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

要启用基线使用,optimizer\u use\u sql\u plan\u基线必须为true

SELECT * FROM dba_sql_plan_baselines
考虑最低成本或最佳运行时间的计划基线。优化器将选择成本最低的可接受计划,但会优先选择固定计划。这是保证CBO使用计划的最佳方式,不管计划有什么提示和SQL概要文件

使用您的基线,然后从dba\U sql\U plan\U baselines视图获取sql句柄

尝试使用以下方法发展it:

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;
开始
dbms_stats.gather_table_stats(ownname=>“”,
tabname=>'',无无效=>FALSE);
结束;
使用旧方法进行分析也会使光标无效

SQL> analyze table <table> estimate statistics sample 1 percent;
SQL>分析表估计统计样本1%;
检查:

SQL> select child_number, executions, parse_calls, loads, invalidations 
     from v$sql where sql_id = '<SQLID>';
SQL>选择子项编号、执行、解析调用、加载、失效
从v$sql开始,其中sql_id='';
事件顺序:

  • 锁定用户
  • 使光标无效
  • 终止以该用户身份登录的所有会话
  • 解锁用户
  • 再次检查

  • 要启用基线使用,optimizer\u use\u sql\u plan\u baselines必须为true

    SELECT * FROM dba_sql_plan_baselines
    
    考虑最低成本或最佳运行时间的计划基线。优化器将选择成本最低的可接受计划,但会优先选择固定计划。这是保证CBO使用计划的最佳方式,不管计划有什么提示和SQL概要文件

    使用您的基线,然后从dba\U sql\U plan\U baselines视图获取sql句柄

    尝试使用以下方法发展it:

    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;
    
    开始
    dbms_stats.gather_table_stats(ownname=>“”,
    tabname=>'',无无效=>FALSE);
    结束;
    
    使用旧方法进行分析也会使光标无效

    SQL> analyze table <table> estimate statistics sample 1 percent;
    
    SQL>分析表估计统计样本1%;
    
    检查:

    SQL> select child_number, executions, parse_calls, loads, invalidations 
         from v$sql where sql_id = '<SQLID>';
    
    SQL>选择子项编号、执行、解析调用、加载、失效
    从v$sql开始,其中sql_id='';
    
    事件顺序:

  • 锁定用户
  • 使光标无效
  • 终止以该用户身份登录的所有会话
  • 解锁用户
  • 再次检查

  • 运行统计数据是否也会暂时阻止计划从基线中被选择?统计数据、数据更改、多个客户端生成子游标、蝴蝶拍动翅膀。。。你明白了。基于成本的分析器是复杂的,执行10053次跟踪可以显示其中的一些细节。我使用OEM的调优顾问和基线来强制更改计划。你可能认为较低成本的计划是显而易见的,但oracle有自己的想法。运行统计数据是否也能暂时阻止计划从基线中被选择?统计数据、数据更改、多个客户端生成子游标、蝴蝶振翅。。。你明白了。基于成本的分析器是复杂的,执行10053次跟踪可以显示其中的一些细节。我使用OEM的调优顾问和基线来强制更改计划。你可能会认为低成本的计划是显而易见的,但甲骨文有自己的想法。