然而,在某些情况下,我们可能又不想使用绑定变量。比如:如果sql语句的where条件之后的列值在表中分布非常不均匀,在条件是某些值的情况下走全表 扫描成本比较低,而另外一些情况下走索引成本比较低,在使用绑定变量的情况下,由于bind peeking技术,在fast parse或soft parse的情况下将会使用第一次硬解析时的执行计划而不会生成新的执行计划,这样将使某些查询陷入困境。
下文中介绍的hints将能够在 cursor_sharing=similar的情况下强制不使用绑定变量:
1. 正常情况下 如果启用了similar ,sql语句会强制使用绑定变量
session 1
SQL>alter session set cursor_sharing=similar;
会话已更改。
SQL>select * from test where id=1;
ID
----------
1
SQL>select * from test where id=2;
ID
----------
2
session 2
SQL>select sql_text,hash_value from v$sqlarea where sql_text like 'select * fro
m test where id%' order by first_load_time desc;
SQL_TEXT
--------------------------------------------------------------------------------
HASH_VALUE
----------
select * from test where id=:"SYS_B_0"
345325898
2.如果使用了hint CURSOR_SHARING_EXACT,将强制不使用绑定变量
session 1
SQL>select /*+ CURSOR_SHARING_EXACT */ * from test where id=1;
ID
----------
1
SQL>select /*+ CURSOR_SHARING_EXACT */ * from test where id=2;
ID
----------
2
SQL>select /*+ CURSOR_SHARING_EXACT */ * from test where id=3;
ID
----------
3
SQL>
session 2
SQL>select sql_text,hash_value from v$sqlarea where sql_text like 'select /*+ C
URSOR_SHARING_EXACT */ * from test where id%' order by first_load_time desc;
SQL_TEXT
--------------------------------------------------------------------------------
HASH_VALUE
----------
select /*+ CURSOR_SHARING_EXACT */ * from test where id=3
1339598962
select /*+ CURSOR_SHARING_EXACT */ * from test where id=2
1720851874
select /*+ CURSOR_SHARING_EXACT */ * from test where id=1
3085093526
另外,在cursor_sharing=force的情况下,使用该hints也会强制不使用绑定变量。
(痴情甲骨文http://space.itpub.net/14130873)
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/104446/viewspace-548864/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/104446/viewspace-548864/