Oracle 如何强制接受SQL计划基线?
在Oracle中(在Oracle Enterprise Manager中查看这一点),我有一个特定的SQL计划基线,设置为Enabled=YES 然而,我不能让被接受的=是的工作。根据文档,您需要同时启用和接受这两个选项 我试图“进化”基线,但OEM抱怨(通过一份报告)它是基线的1.06倍。但事实并非如此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
此外,我想知道如何确保它不会随着时间的推移自动清除,这是它的修复。谢谢 要启用基线使用,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的调优顾问和基线来强制更改计划。你可能会认为低成本的计划是显而易见的,但甲骨文有自己的想法。