NT(*)
----------
75614
13:18:32 sys@felix SQL>
比较查询前后shared pool内存分配的变化:
select a.ksmchcom,
a.chunk,
a.sum,
b.chunk,
b.sum,
(a.chunk - b.chunk) c_diff,
(a.sum - b.sum) s_diff
from(SELECT a.ksmchcom,
SUM(a.CHUNK) CHUNK,
SUM(a.recr) recr,
SUM(a.freeabl) freeabl,
SUM(a.SUM) SUM
FROM (SELECT ksmchcom,
COUNT(ksmchcom) CHUNK,
DECODE(ksmchcls, 'recr',SUM(ksmchsiz), NULL) recr,
DECODE(ksmchcls,'freeabl', SUM(ksmchsiz), NULL) freeabl,
SUM(ksmchsiz) SUM
FROM x$ksmsp
GROUP BY ksmchcom, ksmchcls) a
GROUP BY a.ksmchcom) a,
e$ksmsp b
wherea.ksmchcom = b.ksmchcom
and(a.chunk - b.chunk) <> 0;
KSMCHCOM CHUNK SUM CHUNK SUM C_DIFF S_DIFF
-------------------------------- -------------------- ---------- ---------- ---------- ----------
KGLS^2a03296c 3 12288 1 4096 2 8192
free memory 200 13585552 164 12075904 36 1509648
KGLH0^522f4e73 5 20480 3 12288 2 8192
KGLS^b9dac7f1 14 57344 3 12288 11 45056
KGLH0^c11a66b1 18 73728 2 8192 16 65536
KGLS^3fc2ae3a 12 49152 3 12288 9 36864
KGLH0^61ffddd0 18 73728 2 8192 16 65536
KGLHD 8965 5486488 6456 3979120 2509 1507368
SQLA^522f4e73 10 40960 5 20480 5 20480
KGLS^18717bf4 7 28672 6 24576 1 4096
KGLS^672109bb 3 12288 1 4096 2 8192
KGLH0^4a1d3fe3 18 73728 2 8192 16 65536
reserved stoppe 76 3648 62 2976 14 672
KGLH0^c165fb75 18 73728 2 8192 16 65536
KGLS^a7a0f1b0 14 57344 3 12288 11 45056
KGLS^470434f8 5 20480 1 4096 4 16384
modification 29 178872 20 123360 9 55512
KGLS^b96975f9 8 32768 1 4096 7 28672
KGLS^6e2f6b00 4 16384 3 12288 1 4096
KGLH0^7eef98e0 3 12288 2 8192 1 4096
KGI Session Sta 28 1840 24 1584 4 256
KGLS^e7c28658 3 12288 1 4096 2 8192
KGLH0^3d645f43 18 73728 2 8192 16 65536
KGLH0^1a8436ae 4 16384 3 12288 1 4096
parameter table 308 623840 264 534720 44 89120
KQR SO 1356 899136 773 536304 583 362832
KGLS^1cb5ff2d 10 40960 2 8192 8 32768
KGLS^cfa770fb 5 20480 1 4096 4 16384
KTC latch subh 23 80472 11 46688 12 33784
kpscad: kpscsco 7 576 6 504 1 72
kdlwss 28 11000 24 9408 4 1592
KGLS^518fa5d0 9 36864 1 4096 8 32768
KQR PO 5887 4067840 2616 2037936 3271 2029904
KGLS^d10c66e2 8 32768 2 8192 6 24576
KKSSP 28 15680 24 13440 4 2240
KGLS^6c13497e 6 24576 1 4096 5 20480
KGLNA 8 7048 5 3720 3 3328
KGLH0^7f01546f 18 73728 2 8192 16 65536
KGLDA 3541 850192 2076 498408 1465 351784
KGLS^ea4fb95d 5 20480 1 4096 4 16384
KGLH0^aaab13e6 18 73728 2 8192 16 65536
parameter handl 28 83328 24 71424 4 11904
42 rows selected.
13:18:43 sys@felix SQL>
12:22:30 sys@felix SQL>
简单分析一下以上结果:首先free memory的大小减少了89228(增加到另外5个组件中),这说明SQL解析存储占用了一定的内存空间;而Chunk从164增加为200,这说明内存碎片增加了,碎片增加是共享池性能下降的开始。
1.2.6 Shared Pool的转储与分析
使用如下命令可以对共享池LibraryCache信息进行转储分析:
ALTER SESSION SET EVENTS'immediate trace name LIBRARY_CACHE level LL';
其中LL代表Level级别,对于9.2.0及以后版本,不同Level含义如下:
(1)Level =1,转储Library Cache统计信息;
(2)Level =2,转储Hash Table概要;
(3)Level =4,转储Library Cache对象,只包含基本信息;
(4)Level =8,转储Library Cache对象,包含详细信息(如child references、pin waiters等);
(5)Level =16,增加heap sizes信息;
(6)Level =32,增加heap信息。
Library Cache由一个Hash表组成,而Hash表是一个由Hash Buckets组成的数组,每个hashBucket都是包含Library Cache Handle的一个双向链表。Library Cache Handle指向Library Cache Object和一个引用列表。Library Cache对象进一步分为依赖表、子表和授权表等。
首先通过以下命令对Library Cache进行转储:
13:18:43 sys@felix SQL>ALTER SESSION SET EVENTS'immediate trace name LIBRARY_CACHE level 4';
Session altered.
13:32:24 sys@felix SQL>?
13:39:49 sys@felix SQL>col namespace for a30
13:40:04 sys@felix SQL>select gets,pins,reloads,INVALIDATIONS ,namespac