简单分析shared pool(三)

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

                                                 
         

时间: 2024-08-02 17:25:22

简单分析shared pool(三)的相关文章

简单分析shared pool(二)

对于shared pool的学习,发现越尝试去了解,发现自己对它越不了解.里面的东西很杂. 自己想用几个问题来作为引子来说明更加会有条理一些.shared pool的大小设置 对于shared pool的大小设置,从早期版本到现在一直都带有争论. 从操作上来说,需要设置shared_pool_size就可以了,如果启用了sga_target或者11g里的memory_target,那shared pool的大小设置都是自动管理的了. 还有shared_pool_reserved_size会在sh

简单分析shared pool(一)

oracle中的shared pool很重要,但是感觉知之甚少.今天想在原来的认识上能够有一点更深入的了解. 简单做了一个总结. 首先是转储一下shared pool共享内存的内容. SQL> alter session set events 'immediate trace name heapdump level 2'; Session altered. 这个步骤会得到一个trace文件.简单的换算一下,就得到了trace文件的大体信息. SQL> select sid from v$mys

关于shared pool的深入探讨(二)

关于shared pool的深入探讨(二) Sunday, 2004-08-22 21:23 Eygle       link: http://www.eygle.com/internal/shared_pool-2.htm我们继续把前面的问题展开一下. 其实我们可以从数据库内部监控shared pool的空间碎片情况.这涉及到一个内部视图x$ksmsp X$KSMSP的名称含义为: [K]ernal [S]torage [M]emory Management [S]GA Hea[P]其中每一行

shared pool 深度解析2+

Library cache是Shared pool的一部分,它几乎是Oracle内存结构中最复杂的一部分,主要存放shared curosr(SQL)和PLSQL对象(function,procedure,trigger)的信息,以及这些对象所依赖的table,index,view等对象的信息. Library cache需要解决三个问题: 1.快速定位的问题:Library cache中对象众多,Oracle如何管理这些对象,以便服务进程可以迅速找到他们需要的信息.比如某个服务进程需要迅速定位

shared pool 深度解析1+

原文整理自网络 1. 深入Shared Pool   Oracle数据库作为一个管理数据的产品,必须能够认出用户所提交的管理命令(通常叫做SQL语句),从而进行响应.认出的过程叫做解析SQL语句的过程,响应的过程叫做执行SQL语句的过程.解析是一个相当复杂的过程,它要考虑各种可能的异常情况,比如SQL语句涉及的对象不存在.提交的用户没有权限等.而且,还需要考虑如何执行SQL语句,采用什么方式去获取数据等.解析的最终结果是要产生Oracle自己内部的执行计划,从而指导SQL的执行过程.可以看到,解

共享池的调整与优化(Shared pool Tuning)

--======================================= -- 共享池的调整与优化(Shared pool Tuning) --=======================================       共享池(Shared pool)是SGA中最关键的内存片段,共享池主要由库缓存(共享SQL区和PL/SQL区)和数据字典缓存组成.其中库缓存的作用是存 放频繁使用的sql,pl/sql代码以及执行计划.数据字段缓存用于缓存数据字典.在内存空间有限的容量下

shared pool 深度解析3(subpool)+

我们知道,从Oracle 9i开始,Shared Pool可以被分割为多个子缓冲池(SubPool)进行管理,以提高并发性,减少竞争. Shared Pool的每个SubPool可以被看作是一个Mini Shared Pool,拥有自己独立的Free List.内存结构以及LRU List.同时Oracle提供多个Latch对各个子缓冲池进行管理,从而避免单个Latch的竞争(Shared Pool Reserved Area同样进行分割管理).SubPool最多可以有7个,Shared Poo

[转载】——故障排除:Shared Pool优化和Library Cache Latch冲突优化 (文档 ID 1523934.1)

原文链接:https://support.oracle.com/epmos/faces/DocumentDisplay?_adf.ctrlstate=23w4l35u5_4&id=1523934.1用途   提出问题,得到帮助并分享您的心得   排错步骤   什么是shared pool?   专用术语   Literal SQL   Hard Parse(硬解析)   Soft Parse(软解析)   完全相同的语句?   Sharable SQL   语句的版本   Library Cac

【每日一摩斯】-Shared Pool优化和Library Cache Latch冲突优化 (1523934.1)-系列1

什么是Shared Pool?        Oracle的实例主要包括共享内存(主要是SGA,还有PGA)和Background Processes,其中SGA中又包括了Shared Pool.Buffer Cache.Redo Log Buffer以及其它一些内存区.        Oracle在SGA的一个特定区域中保留SQL语句.Package是.对象信息以及其它一些内容,这就是Shared Pool.这个共享内存区域是由一个复杂的cache和heap manager 构成的.它需要解决