System altered.
SQL> alter session set optimizer_index_caching=100 ; --然后修改这个优化器参数
Session altered.
SQL> select hash_value,sql_id,version_count,parse_calls,sql_text from v$sqlarea where sql_text like ‘select sum(object_id) from test.test%‘; --sql语句还么有运行,所以没有任何记录
no rows selected
SQL> select sum(object_id) from test.test; --引用了sum函数,使得优化器参数生效
SUM(OBJECT_ID)
--------------
20545604
这个时候去查看父游标的信息,发现version_count只有一个
SQL> select hash_value,sql_id,version_count,parse_calls,sql_text from v$sqlarea where sql_text like ‘select sum(object_id) from test.test%‘;
HASH_VALUE SQL_ID VERSION_COUNT PARSE_CALLS SQL_TEXT
--------------------------------------------------------------------------------
4120698675 afrus1buttrtm 1 1 select sum(object_id) from test.test
然后我们修改优化器参数,运行同样的sql语句
SQL> alter session set optimizer_index_caching=60;
Session altered.
SQL> select sum(object_id) from test.test;
SUM(OBJECT_ID)
--------------
20545604
这个时候会发现还是出现了不同之处。version_count变为了2
SQL> select hash_value,sql_id,version_count,parse_calls,sql_text from v$sqlarea where sql_text like ‘select sum(object_id) from test.test%‘;
HASH_VALUE SQL_ID VERSION_COUNT PARSE_CALLS SQL_TEXT
--------------------------------------------------------------------------------
4120698675 afrus1buttrtm 2 2 select sum(object_id) from test.test
如果这个时候查看子游标的信息,就会发现child_number会有2个。这也是我们希望看到的不同之处。
SQL> select child_address,hash_value,sql_id,child_number from v$sql where hash_value=‘4120698675‘;
CHILD_AD HASH_VALUE SQL_ID CHILD_NUMBER
-------- ---------- ------------- ------------
2F155C88 4120698675 afrus1buttrtm 0
2F3A26D8 4120698675 afrus1buttrtm 1
总结一下,在sql语句的执行中,cursor是一个很重要的概念,可能会贯穿整个shared pool的各个层面,通过一些补充的实验可以验证我们原本固有的思想,可能会发现绑定变量在特定的场景下使用效果是很明显的,有时候我们可能都没有意识到本身就在使用。
原文:http://blog.itpub.net/23718752/viewspace-1730139/