关于游标共享测试和总结
Posted wangxingc
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于游标共享测试和总结相关的知识,希望对你有一定的参考价值。
游标共享的前提条件是sql文本要完全相同。
如下sql语句中
s1: select * from t1 where object_id=4;
s2: select * from T1 where object_id=4;
s3 :select * from t1 where object_id=4;
s4: select * from t1 where object_id=4;
s2的表名(t1)大写与s1的表名(t1)小写不能算作同一个语句,s4 中t1 之前有空格,所以与其它语句也不会相同,s1和s3完全一样,所以它们是同一条语句。
创建测试表
SQL>create table t1 as select * from dba_objects; SQL>create index idx_t1 on t1(object_id); SQL> select count(*) from t1; COUNT(*) ---------- 91044
注:oracle 在sql硬解析之前首先会将对sql语句生成散列值,进而在库缓存中去搜索,如果能找到,则说明语句之前有执行过,这时语句有一个可共享的父游标。
执行上述4条语句,然后查询v$sqlarea
select sql_id,sql_text,executions from v$sqlarea where sql_text like ‘%=4‘;
SQL_ID SQL_TEXT EXECUTIONS ------------- ---------------------------------------------------------------------------------------------------- ---------- 0msd0jqtz1fta select * from t1 where object_id=4 2 cq9uku9a36w3j select * from t1 where object_id=4 2 b472gkg0mgbzv select * from T1 where object_id=4 1
由此可证明由于语句大大小写以及空格等原因,生成了了三个父游标。
子游标能够共享的前提是优化器环境,用户模式等需要完全一致
下面以不同的优化器模式执行s1
SQL> alter session set optimizer_mode = all_rows; Session altered. SQL> select * from t1 where object_id=4; 结果略 SQL> alter session set optimizer_mode = first_rows; Session altered. SQL> select * from t1 where object_id=4; 结果略
查询v$sql 试图
SQL> select sql_id,child_number,optimizer_mode,plan_hash_value from v$sql where sql_text=‘select * from t1 where object_id=4‘; SQL_ID CHILD_NUMBER OPTIMIZER_ PLAN_HASH_VALUE ------------- ------------ ---------- --------------- 0msd0jqtz1fta 0 ALL_ROWS 3983389365 0msd0jqtz1fta 1 FIRST_ROWS 3983389365
可以看到同父游标(sql_id相同)下有两个子游标,优化器环境不同导致优化器生成两个子游标, PLAN_HASH_VALUE这一列相同说明两个子游标共享相同的执行计划。
以上是关于关于游标共享测试和总结的主要内容,如果未能解决你的问题,请参考以下文章