专栏首页杨建荣的学习笔记简单分析shared pool(三) (r5笔记第94天)

简单分析shared pool(三) (r5笔记第94天)

提到shared pool,都会不由得和sql语句的解析过程联系起来,因为shared pool所做的主要工作就是解析sql语句,生成执行计划,在之前的两篇中对于shared pool的存储进行了简单的分析,在10g,11g都是保留了255个bucket,可见这个值还是一个最优的默认值了。 在第二篇中分析了一些关于绑定变量的内容,一般一提到sql语句的解析,都会多多少少提到绑定变量,其实有时候也给我们带来一些困扰,其实直接使用绑定是一种情况,还可以通过其它的方式间接使用。 比如下面的例子。 declare cursor test_cur is select object_id,object_name from t ; begin for i in test_cur loop insert into t values(i.object_id,i.object_name); end loop; commit; end; / 我们在pl/sql中使用游标的方式,可能我们都没有意识到我们已经在使用了。不过还有一个细节之处就是在pl/sql里面直接调用sql语句的时候, shared pool里都是转换成大写来处理的。

select  hash_value,sql_id,child_latch,version_count,sql_text,parse_calls from v$sqlarea
  where sql_text like 'INSERT%';

HASH_VALUE SQL_ID        CHILD_LATCH  VERSION_COUNT SQL_TEXT  PARSE_CALLS
---------- ------------- -----------  ------------- --------------------
1681598159 c0rddkpk3q9qg            3             1 INSERT INTO T  VALUES(:B2 ,:B1 )    1

如果在另一种场景中使用绑定变量的方式,结果会略有不同 declare cursor test_cur is select object_id,object_name from t ; begin for i in test_cur loop execute immediate 'insert into t values(:a,:b)' using i.object_id,i.object_name; end loop; commit; end; / 使用下面的语句就不会得到需要的信息了。

select  hash_value,sql_id,child_latch,version_count,sql_text,parse_calls from v$sqlarea  where sql_text like 'INSERT%' 

而是需要使用

select  hash_value,sql_id,child_latch,version_count,sql_text,parse_calls from v$sqlarea  where sql_text like 'insert%'
HASH_VALUE SQL_ID        CHILD_LATCH  VERSION_COUNT SQL_TEXT PARSE_CALLS
---------- ------------- -----------  ------------- --------------------
4026877341 54wqkdbs0ajcx            1             1 insert into t values  (:a,:b)     1

得到的sql_id也会大大不同。 如果更近一步我们再来考虑一些额外的影响,我们会发现同样的sql语句在不同的上下文环境中还会有一些不同, 因为在cursor_sharing=EXTRACT的默认模式下反复尝试,Oracle都处理的很好,不会产生大量的child cursor。 为了验证,我们只好动用一些其他的方法,比如修改优化器的一些默认配置,使得两条sql语句运行中的上下文环境会一些明显的不同。

SQL>  alter system flush shared_pool;  --先来刷新shared pool
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的各个层面,通过一些补充的实验可以验证我们原本固有的思想,可能会发现绑定变量在特定的场景下使用效果是很明显的,有时候我们可能都没有意识到本身就在使用。

本文分享自微信公众号 - 杨建荣的学习笔记(jianrong-notes),作者:r5笔记第94天

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2015-07-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • MySQL误操作数据恢复的简单实践(r11笔记第67天)

    前几天有个同事碰到了一个MySQL数据恢复的问题,他运行了一条update语句,结果忘记了加where条件,结果等反应过来已经晚了。我简单确认了下,是否...

    jeanron100
  • MySQL备份恢复第一篇(r5笔记第5天)

    今天学习了下MySQL的备份恢复内容,也算是对之前的 数据导入导出的一个细化内容。备份恢复的内容其实还是蛮复杂的,一般网站上提到的备份恢复也基本都是逻辑备份恢复...

    jeanron100
  • 由drop datafile导致的oracle bug(r6笔记第56天)

    今天碰到了一个dataguard在10gR2的bug,不管怎么样确实是在特定的时间做了特定的操作结果碰到了特定的问题。 这个问题是在10gR2的版本10.2.0...

    jeanron100
  • 按图索骥:SQL中数据倾斜问题的处理思路与方法

    数据倾斜即表中某个字段的值分布不均匀,比如有100万条记录,其中字段A中有90万都是相同的值。这种情况下,字段A作为过滤条件时,可能会引起一些性能问题。 本文通...

    企鹅号小编
  • 按图索骥:SQL中数据倾斜问题的处理思路与方法

    数据倾斜即表中某个字段的值分布不均匀,比如有100万条记录,其中字段A中有90万都是相同的值。这种情况下,字段A作为过滤条件时,可能会引起一些性能问题。 本文...

    数据和云
  • 机器学习CS229:朴素贝叶斯&exercise6

    用朴素贝叶斯实现垃圾邮件分类器,解题代码如下 numTrainDocs = 700; numTokens = 2500; M = dlmread('F:...

    kalifa_lau
  • MySQL两表差集最佳实践

    朱明豪
  • MySQL和Oracle中唯一性索引的差别(r12笔记第83天)

    今天在修复MySQL数据的时候,发现一个看起来“奇怪”的问题。 有一个表里存在一个唯一性索引,这个索引包含3个列,这个唯一性索引的意义就是通过这3个列...

    jeanron100
  • SQL:数据与运算的融合体

    本公众号主要关注大数据中的非结构处理,但在实际应用中,通常也离不开结构化数据处理,只不过相对而言其工具和开发环境比较成熟了。 SQL语言是结构化数据处理最常用的...

    企鹅号小编
  • 死锁案例之八

    死锁其实是一个很有意思也很有挑战的技术问题,大概每个DBA和部分开发朋友都会在工作过程中遇见。关于死锁我会持续写一个系列的案例分析,希望能够对想了解死锁的朋友有...

    用户1278550

扫码关注云+社区

领取腾讯云代金券