RELATEED CONSULTING
相关咨询
选择下列产品马上在线沟通
服务时间:9:30-18:00
你可能遇到了下面的问题
关闭右侧工具栏
关于shared pool的深入探讨(一)
  • 作者:xiaoxiao
  • 发表时间:2020-12-23 10:58
  • 来源:未知

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

link:

http://www.eygle.com/internal/shared_pool-1.htm

关于shared pool的设置一直是一个争议较多的内容.很多文章上说,shared pool设置过大会带来额外的管理上的负担,从而在某些条件下会导致性能的下降.

那么这个管理上的负担指的是什么内容呢?本文对这个内容作一定的深入探讨.本文只涉及一个方面,后续的文章将从其他方面继续讨论.

基础知识:

我们可以通过如下命令转储shared pool共享内存的内容:

SQL> alter session set events 'immediate trace name heapdump level 2';

Session altered.

本测试中引用的两个trace文件:

9i:

SQL> @gettrcname

TRACE_FILE_NAME--------------------------------------------------------------------------------/opt/oracle/admin/hsjf/udump/hsjf_ora_24983.trc

8i:

SQL> @gettrcname

TRACE_FILE_NAME--------------------------------------------------------------------------------/usr/oracle8/admin/guess/udump/guess_ora_22038.trc

Shared Pool通过free list管理free块,Free List按不同size划分Bucket在Oracle8i中,不同bucket的size范围如下所示(size显示的是下边界):

oracle:/usr/oracle8/admin/guess/udump>cat guess_ora_22038.trc|grep Bucket Bucket 0 size=44  Bucket 1 size=76  Bucket 2 size=140 Bucket 3 size=268 Bucket 4 size=524 Bucket 5 size=1036 Bucket 6 size=2060 Bucket 7 size=4108 Bucket 8 size=8204 Bucket 9 size=16396 Bucket 10 size=32780

我们注意,在这里,小于76的块都位于Bucket 0上;大于32780的块,都在Bucket 10上初始的,数据库启动以后,shared pool多数是连续内存块当空间分配使用以后,内存块开始被分割,碎片开始出现,Bucket列表开始变长

Oracle请求shared pool空间时,首先进入相应的Bucket进行查找如果找不到,则转向下一个非空的bucket,获取第一个chunk分割这个chunk,剩余部分会进入相应的Bucket,进一步增加碎片

最终的结果是,Bucket 0上的内存块会越来越多,越来越碎小(在我这个测试的小型的数据库上,Bucket 0上的碎片已经达到9030个而shared_pool_size设置仅为150M)通常如果每个Bucket上的chunk多余2000个,就被认为是share pool碎片过多

而在大多数情况下,我们请求的都是相对小的chunk,这样搜索Bucket 0往往消耗了大量的时间以及资源这可能导致share pool Latch被长时间的持有,导致更多的share pool竞争

所以在Oracle9i之前,如果盲目的增大shared_pool_size或设置过大的shared_pool_size,往往会适得其反

我们看一下Oracle9i中的处理方式:

[oracle@jumper oracle]$ sqlplus "/ as sysdba"

SQL*Plus: Release 9.2.0.3.0 - Production on Wed Aug 18 22:13:07 2004

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.