今天一个SQL用BASELINE没搞定,BASELINE没起作用,原因还在找。
忽然想起了SQL PROFILE,就试了一下,嘿嘿,果然还不错,起作用了。
以下是个用法示例:
根据DBA_OBJECTS创建个表,OBJECT_ID列上创建索引。
按照OBJECT_ID去查询,默认的走了索引,我们看看如何让他通过SQL PROFILE去走全表扫描。
declare
v_hints sys.sqlprof_attr;
begin
v_hints := sys.sqlprof_attr('full(wxh_tbd@sel$1)');----------HINT部分
dbms_sqltune.import_sql_profile('select count(*) from wxh_tbd where object_id=:a',----------SQL语句部分
v_hints,
'SQLPROFILE_NAME3',--------------------------------PROFILE 的名字
force_match => true);
end;
/
select count(*) from wxh_tbd where object_id=:a;
Execution Plan
----------------------------------------------------------
Plan hash value: 853361775
------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 13 | 144 (3)| 00:00:01 |
| 1 | SORT AGGREGATE | | 1 | 13 | | |
|* 2 | TABLE ACCESS FULL| WXH_TBD | 198 | 2574 | 144 (3)| 00:00:01 |
------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter("OBJECT_ID"=TO_NUMBER(:A))
Note
-----
- SQL profile "SQLPROFILE_NAME3" used for this statement-----------------------我们看到SQL PROFILE 起作用了
SQL PROFILE的好处是,你的SQL语句不区分大小写,回车之类的,只要文本一样就OK,这个有点比较赞。
删除SQL PROFILE
通过select * from dba_sql_profiles a;查询出PROFILE 的NAME,
然后
exec dbms_sqltune.drop_sql_profile('SYS_SQLPROF_012ed61fe9bd0000'); 来删除
不过用SQL PROFILE,写HINT的时候,我测试的情况是,必须写上查询块的名称,这在一定程度上,要求对查询块比较熟悉。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/22034023/viewspace-697116/,如需转载,请注明出处,否则将追究法律责任。