问题描述
创建实验表
create table sqltest as select * from hr.employees;
select * from sqltest s where s.employee_id =202;
select sql_id,sql_text from v$sql where sql_text like '%s.employee_id =202%';
SQL_TEXT
--------------------------------------------------------------------------------
7arc85h8gfyn6
select * from sqltest s where s.employee_id =202
1aa7ub8cx3p8r
select sql_id,sql_text from v$sql where sql_text like '%s.employee_id =202%'
select * from table(dbms_xplan.display_cursor());
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
SQL_ID 7arc85h8gfyn6, child number 0
-------------------------------------
select * from sqltest s where s.employee_id =202
Plan hash value: 2099455689
-----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 2 (100)| |
|* 1 | TABLE ACCESS FULL| SQLTEST | 1 | 133 | 2 (0)| 00:00:01 |
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
-----------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("S"."EMPLOYEE_ID"=202)如何将2099455689此执行计划固定在SQL7arc85h8gfyn6上?
专家解答
绑定该执行计划
输入:7arc85h8gfyn6,2099455689
declare
v_hint sys.sqlprof_attr;
v_sql_text clob;
p_bad_sqlid varchar2(32) default '&bad_sqlid';
begin
select sql_text
into v_sql_text
from dba_hist_sqltext
where sql_id = p_bad_sqlid
and rownum = 1;
select extractvalue(value(d), '/hint') as outline_hints bulk collect
into v_hint
from xmltable('/*/outline_data/hint' passing
(select xmltype(other_xml) as xmlval
from dba_hist_sql_plan
where sql_id = '&bad_sqlid'
and plan_hash_value = '&good_hash'
and other_xml is not null)) d;
dbms_sqltune.import_sql_profile(v_sql_text,
v_hint,
'sql_profile_&bas_sqlid',
force_match => true,
replace => true);
end;创建索引依旧不会全表扫
SQL> CREATE INDEX TESE_1 ON SQLTEST(employee_id);
Index created.
SQL> select * from sqltest s where s.employee_id =202;
SQL> select * from table(dbms_xplan.display_cursor());
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
SQL_ID 7arc85h8gfyn6, child number 0
-------------------------------------
select * from sqltest s where s.employee_id =202
Plan hash value: 2099455689
-----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 2 (100)| |
|* 1 | TABLE ACCESS FULL| SQLTEST | 2 | 266 | 2 (0)| 00:00:01 |
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
-----------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("S"."EMPLOYEE_ID"=202)
Note
-----
- SQL profile sql_profile_7arc85h8gfyn6 used for this statement提示sql_profile生效。
删除sql_profile,验证效果
SQL> exec dbms_sqltune.drop_sql_profile(name => 'sql_profile_7arc85h8gfyn6');
PL/SQL procedure successfully completed.
SQL> select * from sqltest s where s.employee_id =202;
EMPLOYEE_ID FIRST_NAME LAST_NAME
----------- -------------------- -------------------------
EMAIL PHONE_NUMBER HIRE_DATE JOB_ID SALARY
------------------------- -------------------- --------- ---------- ----------
COMMISSION_PCT MANAGER_ID DEPARTMENT_ID
-------------- ---------- -------------
202 Pat Fay
PFAY 603.123.6666 17-AUG-05 MK_REP 6000
201 20
SQL> select * from table(dbms_xplan.display_cursor());
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
SQL_ID 7arc85h8gfyn6, child number 0
-------------------------------------
select * from sqltest s where s.employee_id =202
Plan hash value: 1486395402
--------------------------------------------------------------------------------
-------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Tim
e |
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 2 (100)|
| 1 | TABLE ACCESS BY INDEX ROWID| SQLTEST | 1 | 133 | 2 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | TESE_1 | 1 | | 1 (0)| 00: 00:01 |
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("S"."EMPLOYEE_ID"=202)删除profile后走索引扫,验证绑定成功。
最后修改时间:2019-04-14 10:23:06
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




