ITPub博客

首页 > 数据库 > Oracle > 利用sql_profile得到正确的sql执行计划

利用sql_profile得到正确的sql执行计划

原创 Oracle 作者:bestpaydata 时间:2016-03-09 14:10:13 0 删除 编辑

需要通过脚本coe_xfr_sql_profile.sql 来生成sql profile文本。该脚本来自oracle metalink[ID 215187.1]“

1、得到正确执行计划的outdata

执行计划错误的sql:

select * from t_cs_ctm t where t.product_no = '13411111111' ; sql_id=br1mv51g21cxw

执行计划正确的sql :

select /*+index(t_cs_ctm)*/* from t_cs_ctm t where t.product_no = '13411111111' ; sql_id=afag4gj277b39
1.1 使用coe_xfr_sql_profile.sql脚本来提取我们构造的SQL的Outline Data

运行coe_xfr_sql_profile.sql


SQL> @coe_xfr_sql_profile.sql

Parameter 1:

SQL_ID (required)

-------有正确执行计划的sql_id

Enter value for 1: afag4gj277b39

PLAN_HASH_VALUE AVG_ET_SECS

--------------- -----------

3536615365 .023

Parameter 2:

PLAN_HASH_VALUE (required)

Enter value for 2: 3536615365

Values passed to coe_xfr_sql_profile:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

SQL_ID : "afag4gj277b39"

PLAN_HASH_VALUE: "3536615365"

这里会得到一个命名为coe_xfr_sql_profile_+sql_id+_+PLAN_HASH_VALUE.sql的文件,即:coe_xfr_sql_profile_afag4gj277b39_3536615365.sql
1.2 得到正确sql_profile

SQL>@ coe_xfr_sql_profile_afag4gj277b39_3536615365.sql

SQL>WHENEVER SQLERROR CONTINUE

SQL>SET ECHO OFF;

SIGNATURE

---------------------

17293648302761054394

SIGNATUREF

---------------------

2880340287165392331

... manual custom SQL Profile has been created
2、得到执行计划错误的sql的outline data
2.1 使用coe_xfr_sql_profile.sql脚本来提取我们构造的SQL的Outline Data

运行coe_xfr_sql_profile.sql

SQL> @coe_xfr_sql_profile.sql

Parameter 1:

SQL_ID (required)

-------有正确执行计划的sql_id

Enter value for 1: br1mv51g21cxw

PLAN_HASH_VALUE AVG_ET_SECS

--------------- -----------

3677037978 .023

Parameter 2:

PLAN_HASH_VALUE (required)

Enter value for 2: 3677037978

Values passed to coe_xfr_sql_profile:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

SQL_ID : "afag4gj277b39"

PLAN_HASH_VALUE: "3677037978"


执行结果:coe_xfr_sql_profile_br1mv51g21cxw_3677037978.sql


2.2 得到正确sql_profile

SQL>@ coe_xfr_sql_profile_br1mv51g21cxw_3677037978.sql


3、替换正确的sql_profile
执行计划错误的sql:

select * from t_cs_ctm t where t.product_no = '13411111111' ; sql_id=br1mv51g21cxw

执行计划正确的sql :

select /*+index(t_cs_ctm)*/* from t_cs_ctm t where t.product_no = '13411111111' ; sql_id=afag4gj277b39

coe_xfr_sql_profile_afag4gj277b39_3536615365.sql 好的执行计划

coe_xfr_sql_profile_br1mv51g21cxw_3677037978.sql 坏的执行计划

坏 的执行计划的sql 生成的sql_profile是coe_xfr_sql_profile_br1mv51g21cxw_3677037978.sql, 手工修改这个文件,将里面h := SYS.SQLPROF_ATTR…那一段替换成coe_xfr_sql_profile_afag4gj277b39_3536615365.sql中 得到的那一段。

将这个文件中的force_match从FALSE改成TRUE (force_match => FALSE /* TRUE:FORCE (match even when different literals in SQL). FALSE:EXACT (similar to CURSOR_SHARING) */ );。
最后我们运行coe_xfr_sql_profile_br1mv51g21cxw_3677037978.sql这个脚本文件:

SQL> @ coe_xfr_sql_profile_br1mv51g21cxw_3677037978.sql

4、补充知识

DBMS_SQLTUNE.DROP_SQL_PROFILE( name => 'my_sql_profile' );

通过select * from dba_sql_profiles a;查询出PROFILE 的NAME,

然后执行下面的可以删除对应的sql_profile

exec dbms_sqltune.drop_sql_profile('coe_br1mv51g21cxw_3677037978');
                               -------------------------------------------------------------------------- write by Sunny Hu

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/30109892/viewspace-2051824/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2015-01-19

  • 博文量
    126
  • 访问量
    1054951