目标sql随着where后边条件的selectivity和结果集行数cardinality的不同,执行计划可能随之发生变化。
那么这种情况下oracle是如何选择执行计划的呢?
1、使用绑定变量窥探
2、对于不使用绑定变量窥探的,默认可选择率为5%
绑定变量窥探是在oracle 9i中引入的,隐含参数为_OPTIM_PEEK_USER_BINDS。默认值为true
当绑定变量被启用后,sql每次硬解析的时候都会去探测变量的值,并以这些值为标准制定执行计划。一旦值被确定了,执行计划也就被固定了下来。所以执行计划完全依赖于第一次执行计划时候的变量取值。
清楚指定cursor的执行计划:
select sql_text,sql_id,address,hash_value,version_count,executions,loads from v$sqlarea where sql_text like 'select count(*) from t3%';
exec sys.dbms_shared_pool.purge('address,hash_value,','c'); --清楚指定的cursor
对于文本字符型变量,绑定变量是有分级的,不同长度的变量自符,也会导致生成不同的执行计划
取得绑定变量的值:
v$sql_bind_capture如果这个中查不到,可以到dba_hist_sqlstat或dba_hist_sqlbind中查询。
这个视图中只包含where后边的绑定变量值,并且15分钟间隔捕获,对于insert 并不会捕获。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/26357044/viewspace-2062847/
,如需转载,请注明出处,否则将追究法律责任。