About me:Oracle ACE pro,optimistic,passionate and harmonious. Focus on ORACLE,MySQL and other database programming,peformance tuning,db design, j2ee,Linux/AIX,Architecture tech,etc
全部博文(169)
分类: Oracle
2023-05-07 21:58:51
模拟需要SQL PROFILE绑定的情形,表a的object_id有索引,但是语句使用了full hints导致走不了索引,目前又不能改SQL,需要快速优化,让其走正确执行计划:
select/*+full(a)*/
* from a where object_id <100;
执行计划是全表扫描:
不改SQL,且SQL可以走更好的执行计划,可以使用SQL PROFILE快速绑定,经常用于执行计划不稳定的情形,也可以使用coe_xfr_sql_profile脚本绑定。
declare
v_hints sys.sqlprof_attr;
v_sql_id clob;
begin
v_hints := sys.sqlprof_attr
(
q'[BEGIN_OUTLINE_DATA ]',
q'[INDEX_RS_ASC(@"SEL$1" "A"@"SEL$1" ("A"."OBJECT_ID")) ]',
q'[OUTLINE_LEAF(@"SEL$1") ]',
q'[ALL_ROWS ]',
q'[IGNORE_OPTIM_EMBEDDED_HINTS ]',
q'[END_OUTLINE_DATA ]'
);
select sql_text into v_sql_id from v$sql where sql_id='8c672gv64qvg3';
dbms_sqltune.import_sql_profile(v_sql_id,v_hints,'profile_8c672gv64qvg3',force_match => TRUE);
end;
/
手写脚本来绑定,可以造个正确的执行计划,然后获取OUTLINE信息,这里主要是IGNORE_OPTIM_EMBEDDED_HINTS 忽略原有SQL中的HINTS,使用这个脚本里的HINTS,force_match => TRUE针对字面量SQL,使用不同值也有效。
再看执行计划,虽然使用full hints,但是因为用上了SQL PROFILE走索引。ORACLE针对不改SQL来修改执行计划有很多手段,常用的有SQL
PROFILE,SQL PLAN BASELINE、SPM、SPD等,所以一般不要在SQL里使用HINTS,以免影响生成正确的执行计划。