获取SQL的ID号,并且生成基线
SCOTT> col sql_text for a60
SCOTT> select sql_id,sql_text from v$sql where sql_text like 'select object_id from test where object_id like%';
通过DBMS_SPM包将SQL载入基线,并查看基线名称:
SCOTT> declare
xplan pls_integer;
begin
xplan:=dbms_spm.load_plans_from_cursor_cache(sql_id=>'7g2ycppbr43tu');
end;
/
SCOTT> col plan_name for a30
SCOTT> col sql_handle for a30
SCOTT> select sql_handle,sql_text,plan_name from dba_sql_plan_baselines;
查看基线的执行计划可以看到走的同样是全表扫:
SCOTT> select * from table(dbms_xplan.display_sql_plan_baseline(plan_name=>'SQL_PLAN_dw5mnstphcg0597bbe3d0',format=>'basic'));
创建索引,继续观察SQL语句,这是可以看到SQL选择的是基线生成的执行计划,而不走索引。
SCOTT> create index>
查看基线字典可以发现同一条语句存在两个执行计划的基线:
查看新基线的执行计划:
SCOTT> set serveroutpu on
SCOTT> set long 1000
SCOTT> declare
report varchar2(1000);
begin
report:=dbms_spm.evolve_sql_plan_baseline(sql_handle=>'SYS_SQL_de1674c66b063c05',time_limit=>dbms_spm.no_limit,verify=>'NO');
dbms_output.put_line(report);
end;
/