一篇share pool結構佳文

yezhibin發表於2009-06-15
看了Tanel Poder一篇關於shared pool文章,將其歸納如下:

 1、oracle9i 的shared pool引入了sub-pool概念,10.2進一步將sub pool分成4個
        sub-sub-pool。具體檢視:

          SQL>select count(kghluidx) num_pools
                       from x$kghlu
                       where kghlushrpool=1

              說明:
                     kghlushrpool:
                              =1: shared pool subpools
                              =0: java pool

              sub-sub-pool查詢:
                SQL>select kghluidx, kghludur from x$kghlu
                           where kghlushrpool=1
                                KGHLUIDX   KGHLUDUR
                                --------------------- -----------------
                                             2          3
                                             2          2
                                             2          1
                                             2          0
                                             1          3
                                             1          2
                                             1          1
                                             1          0

        oracle根據shared pool大小和CPU_COUNT來計算需要分成幾個sub pool,例如 oracle9i,shared pool size 大於256MB, cpu_count=4,則分成2個sub pool, 10g中shared pool size 大於512MB,11g應該是1G。

2、可以通過_kghdsidx_count控制sub pool數量

        SQL>select n.ksppinm, c.ksppstvl, n.ksppdesc
                   from x$ksppi n, x$ksppcv c
                   where n.indx = c.indx
                   and lower(n.ksppinm) like lower ('%kghdsidx%');
          NAME       VALUE      DESCRIPTION
-------------- ----------- ------------------------
_kghdsidx_count 2 max kghdsidx count


3、每個sub pool由一個share pool latch控制,3~7表示未使用。

SQL>select child#, gets
from v$latch_children
where name = 'shared pool'
order by child#;
CHILD# GETS
---------- ----------
1 29906417
2 24955057
3 2905
4 2905
5 2905
6 2905
7 2905

4、ORA-04031錯誤
ORA-04031: "unable to allocate n bytes of shared memory
("shared pool", "object_name", "alloc type(2,0)" ...)
type(2,0)表示sub pool# =2, sub sub pool=0

該錯誤通常造成原因:
a)、shared pool空間太小
b)、空閒空間碎片太多
c)、在不同的sub pool中記憶體使用/空閒空間使用不平衡
5、如何獲得各個sub pool中空間資訊,ksmdsidx中,0表示內部使用記憶體,1表示sub pool #1
    SQL>select ksmdsidx sub_pool, sum(ksmsslen) bytes
from x$ksmss
where ksmsslen>0
group by ksmdsidx
order by
sub_pool;

SUB_POOL BYTES
---------- ----------
0 16777216
1 236552072
2 238228464

也可以通過該檢視檢視subpool下具體各個部分分配情況。


另外參看metalink
396940.1: Troubleshooting and Diagnosing ORA-4031 Error


 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/354732/viewspace-606428/,如需轉載,請註明出處,否則將追究法律責任。

相關文章