关于shared pool的深入探讨

Posted 杨哥哥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于shared pool的深入探讨相关的知识,希望对你有一定的参考价值。

基本命令:

ALTER SESSION SET EVENTS ‘immediate trace name LIBRARY_CACHE level LL‘;

其中LL代表Level级别,对于9.2.0及以后版本,不同Level含义如下:
Level =1 ,转储Library cache统计信息
Level =2 ,转储hash table概要
Level =4 ,转储Library cache对象,只包含基本信息
Level =8 ,转储Library cache对象,包含详细信息(包括child references,pin waiters等)
Level =16,增加heap sizes信息
Level =32,增加heap信息

Library cache由一个hash表组成,而hash表是一个由hash buckets组成的数组.

每个hash bucket都是包含library cache handle的一个双向链表。
Library Cache Handle指向Library Cache Object和一个引用列表.
library cache对象进一步分为:依赖表、子表和授权表等

我们看一下library cache的结构:

通过
ALTER SESSION SET EVENTS ‘immediate trace name LIBRARY_CACHE level 4‘
获得以下输出(这部分信息来自Oracle8i,Trace文件可以从www.eygle.com上找到)

点击这里下载: hsbi_ora_4614.trc

第一部分(等价于Level 1):


LIBRARY CACHE STATISTICS:
gets hit ratio pins hit ratio reloads invalids namespace
---------- --------- ---------- --------- ---------- ---------- ---------
619658171 0.9999160 2193292112 0.9999511 9404 380 CRSR
79698558 0.9998832 424614847 0.9999108 13589 0 TABL/PRCD/TYPE
163399 0.9979926 163402 0.9978948 16 0 BODY/TYBD
0 0.0000000 0 0.0000000 0 0 TRGR
34 0.0294118 35 0.0571429 0 0 INDX
18948 0.9968862 24488 0.9953855 0 0 CLST
0 0.0000000 0 0.0000000 0 0 OBJE
0 0.0000000 0 0.0000000 0 0 PIPE
0 0.0000000 0 0.0000000 0 0 LOB
0 0.0000000 0 0.0000000 0 0 DIR
0 0.0000000 0 0.0000000 0 0 QUEU
0 0.0000000 0 0.0000000 0 0 OBJG
0 0.0000000 0 0.0000000 0 0 PROP
0 0.0000000 0 0.0000000 0 0 JVSC
0 0.0000000 0 0.0000000 0 0 JVRE
0 0.0000000 0 0.0000000 0 0 ROBJ
0 0.0000000 0 0.0000000 0 0 REIP
0 0.0000000 0 0.0000000 0 0 CPOB
115071 0.9992179 115071 0.9930999 704 0 EVNT
0 0.0000000 0 0.0000000 0 0 SUMM
0 0.0000000 0 0.0000000 0 0 DIMN
0 0.0000000 0 0.0000000 0 0 CTX
0 0.0000000 0 0.0000000 0 0 OUTL
0 0.0000000 0 0.0000000 0 0 RULS
0 0.0000000 0 0.0000000 0 0 RMGR
0 0.0000000 0 0.0000000 0 0 UNUSED
0 0.0000000 0 0.0000000 0 0 PPLN
0 0.0000000 0 0.0000000 0 0 PCLS
0 0.0000000 0 0.0000000 0 0 SUBS
0 0.0000000 0 0.0000000 0 0 LOCS
0 0.0000000 0 0.0000000 0 0 RMOB
0 0.0000000 0 0.0000000 0 0 RSMD
699654181 0.9999117 2618209955 0.9999440 23713 380 CUMULATIVE

这部分信息也就是v$librarycache中显示的. 

第二部分(等价于Level 2中的输出):

 

 


LIBRARY CACHE HASH TABLE: size=509 count=354
BUCKET 0:
BUCKET 1:
BUCKET 2: *
BUCKET 3:
BUCKET 4:
BUCKET 5: *
BUCKET 6: *
BUCKET 7:
BUCKET 8: **
BUCKET 9: ***
BUCKET 10: *
BUCKET 11: *
BUCKET 12: ***
BUCKET 13: *
BUCKET 14: *
BUCKET 15:
BUCKET 16: *
BUCKET 17:
BUCKET 18: *
BUCKET 19:
BUCKET 20:
BUCKET 21: *
BUCKET 22:
BUCKET 23:
BUCKET 24: *
BUCKET 25:
BUCKET 26:
BUCKET 27: ***
BUCKET 28:
BUCKET 29: **
BUCKET 30:
BUCKET 31:
BUCKET 32: ***
BUCKET 33: *
BUCKET 34:
BUCKET 35:
BUCKET 36: **
BUCKET 37:
BUCKET 38: **
BUCKET 39: *
BUCKET 40: *
BUCKET 41:
BUCKET 42:
BUCKET 43:
BUCKET 44:
BUCKET 45:
BUCKET 46: ****
BUCKET 47:
BUCKET 48:
BUCKET 49: *
BUCKET 50: *
BUCKET 51:
BUCKET 52: ***
BUCKET 53: **
BUCKET 54:
BUCKET 55: *
BUCKET 56:
BUCKET 57:
BUCKET 58:
BUCKET 59: *
BUCKET 60: **
BUCKET 61:
BUCKET 62: *
BUCKET 63:
BUCKET 64: *
BUCKET 65:
BUCKET 66:
BUCKET 67: *
BUCKET 68:
BUCKET 69: **
BUCKET 70:
BUCKET 71:
BUCKET 72: *
BUCKET 73:
BUCKET 74:
BUCKET 75: *
BUCKET 76: **
BUCKET 77:
BUCKET 78: ****
BUCKET 79:
BUCKET 80: *
BUCKET 81: *
BUCKET 82:
BUCKET 83: **
BUCKET 84: *
BUCKET 85:
BUCKET 86:
BUCKET 87:
BUCKET 88:
BUCKET 89: *
BUCKET 90: *
BUCKET 91:
BUCKET 92: *
BUCKET 93: *
BUCKET 94: *
BUCKET 95:
BUCKET 96: *
BUCKET 97:
BUCKET 98:
BUCKET 99: ***
BUCKET 100: *
BUCKET 101:
BUCKET 102: *
BUCKET 103:
BUCKET 104: *
BUCKET 105:
BUCKET 106:
BUCKET 107: ****
BUCKET 108:
BUCKET 109:
BUCKET 110:
BUCKET 111: *
BUCKET 112: **
BUCKET 113:
BUCKET 114:
BUCKET 115:
BUCKET 116: *
BUCKET 117:
BUCKET 118: *****
BUCKET 119:
BUCKET 120: *
BUCKET 121:
BUCKET 122:
BUCKET 123:
BUCKET 124:
BUCKET 125: *
BUCKET 126:
BUCKET 127:
BUCKET 128: *
BUCKET 129:
BUCKET 130: *
BUCKET 131: *
BUCKET 132:
BUCKET 133:
BUCKET 134:
BUCKET 135: *
BUCKET 136:
BUCKET 137:
BUCKET 138:
BUCKET 139: *
BUCKET 140: *
BUCKET 141: *
BUCKET 142:
BUCKET 143: *
BUCKET 144:
BUCKET 145: ***
BUCKET 146:
BUCKET 147: *
BUCKET 148:
BUCKET 149:
BUCKET 150: **
BUCKET 151:
BUCKET 152:
BUCKET 153: *
BUCKET 154:
BUCKET 155:
BUCKET 156:
BUCKET 157:
BUCKET 158:
BUCKET 159:
BUCKET 160:
BUCKET 161:
BUCKET 162:
BUCKET 163:
BUCKET 164: *
BUCKET 165: *
BUCKET 166:
BUCKET 167:
BUCKET 168:
BUCKET 169:
BUCKET 170: **
BUCKET 171:
BUCKET 172: *
BUCKET 173:
BUCKET 174:
BUCKET 175: *
BUCKET 176: *
BUCKET 177:
BUCKET 178:
BUCKET 179:
BUCKET 180:
BUCKET 181: *
BUCKET 182:
BUCKET 183:
BUCKET 184:
BUCKET 185: *
BUCKET 186:
BUCKET 187:
BUCKET 188: **
BUCKET 189:
BUCKET 190: *
BUCKET 191: *
BUCKET 192:
BUCKET 193:
BUCKET 194: *
BUCKET 195: **
BUCKET 196: *
BUCKET 197: **
BUCKET 198: ****
BUCKET 199: *
BUCKET 200: *
BUCKET 201: *
BUCKET 202: **
BUCKET 203:
BUCKET 204:
BUCKET 205: **
BUCKET 206:
BUCKET 207:
BUCKET 208: *
BUCKET 209: **
BUCKET 210:
BUCKET 211: *
BUCKET 212: *
BUCKET 213: *
BUCKET 214:
BUCKET 215:
BUCKET 216:
BUCKET 217: *
BUCKET 218: *
BUCKET 219:
BUCKET 220:
BUCKET 221: *
BUCKET 222:
BUCKET 223: *
BUCKET 224:
BUCKET 225:
BUCKET 226: *
BUCKET 227:
BUCKET 228: *
BUCKET 229: **
BUCKET 230: *
BUCKET 231:
BUCKET 232: **
BUCKET 233:
BUCKET 234: *
BUCKET 235: *
BUCKET 236:
BUCKET 237:
BUCKET 238: *
BUCKET 239:
BUCKET 240: **
BUCKET 241: **
BUCKET 242: **
BUCKET 243: ***
BUCKET 244:
BUCKET 245: *
BUCKET 246:
BUCKET 247:
BUCKET 248: **
BUCKET 249:
BUCKET 250:
BUCKET 251: **
BUCKET 252:
BUCKET 253: *
BUCKET 254: *
BUCKET 255:
BUCKET 256:
BUCKET 257: **
BUCKET 258: *
BUCKET 259:
BUCKET 260:
BUCKET 261: *
BUCKET 262: **
BUCKET 263: ***
BUCKET 264:
BUCKET 265: *
BUCKET 266:
BUCKET 267: *
BUCKET 268: *
BUCKET 269:
BUCKET 270:
BUCKET 271: **
BUCKET 272: *
BUCKET 273:
BUCKET 274: *
BUCKET 275: *
BUCKET 276: **
BUCKET 277:
BUCKET 278:
BUCKET 279:
BUCKET 280:
BUCKET 281: **
BUCKET 282: *
BUCKET 283: *
BUCKET 284: *
BUCKET 285: *
BUCKET 286:
BUCKET 287: *
BUCKET 288:
BUCKET 289:
BUCKET 290: **
BUCKET 291:
BUCKET 292: *
BUCKET 293:
BUCKET 294: *
BUCKET 295:
BUCKET 296: *
BUCKET 297:
BUCKET 298:
BUCKET 299: **
BUCKET 300: *
BUCKET 301:
BUCKET 302: *
BUCKET 303: *
BUCKET 304: **
BUCKET 305: **
BUCKET 306:
BUCKET 307:
BUCKET 308: *
BUCKET 309:
BUCKET 310:
BUCKET 311: **
BUCKET 312: *
BUCKET 313:
BUCKET 314: *
BUCKET 315:
BUCKET 316:
BUCKET 317:
BUCKET 318:
BUCKET 319: ***
BUCKET 320: *
BUCKET 321: **
BUCKET 322: **
BUCKET 323:
BUCKET 324: *
BUCKET 325:
BUCKET 326: *
BUCKET 327: *
BUCKET 328: **
BUCKET 329:
BUCKET 330: *
BUCKET 331:
BUCKET 332:
BUCKET 333: *
BUCKET 334: *
BUCKET 335: ***
BUCKET 336: *
BUCKET 337: **
BUCKET 338: *
BUCKET 339: *
BUCKET 340:
BUCKET 341: *
BUCKET 342: *
BUCKET 343: **
BUCKET 344:
BUCKET 345:
BUCKET 346:
BUCKET 347: *
BUCKET 348:
BUCKET 349: ***
BUCKET 350: *
BUCKET 351:
BUCKET 352:
BUCKET 353:
BUCKET 354: *
BUCKET 355: **
BUCKET 356:
BUCKET 357:
BUCKET 358: **
BUCKET 359: *
BUCKET 360: *
BUCKET 361: **
BUCKET 362:
BUCKET 363:
BUCKET 364: *
BUCKET 365: *
BUCKET 366: **
BUCKET 367: *
BUCKET 368:
BUCKET 369: *
BUCKET 370:
BUCKET 371: ***
BUCKET 372:
BUCKET 373: *
BUCKET 374:
BUCKET 375:
BUCKET 376: *
BUCKET 377:
BUCKET 378:
BUCKET 379:
BUCKET 380:
BUCKET 381:
BUCKET 382:
BUCKET 383: **
BUCKET 384:
BUCKET 385:
BUCKET 386:
BUCKET 387: ***
BUCKET 388: *
BUCKET 389:
BUCKET 390:
BUCKET 391:
BUCKET 392:
BUCKET 393: *
BUCKET 394: *
BUCKET 395: *
BUCKET 396:
BUCKET 397:
BUCKET 398:
BUCKET 399:
BUCKET 400: **
BUCKET 401:
BUCKET 402:
BUCKET 403:
BUCKET 404:
BUCKET 405:
BUCKET 406:
BUCKET 407: *
BUCKET 408: *
BUCKET 409: *
BUCKET 410:
BUCKET 411: *
BUCKET 412:
BUCKET 413:
BUCKET 414:
BUCKET 415:
BUCKET 416: *
BUCKET 417:
BUCKET 418: *
BUCKET 419:
BUCKET 420: **
BUCKET 421: *
BUCKET 422:
BUCKET 423: **
BUCKET 424: ***
BUCKET 425:
BUCKET 426: *
BUCKET 427: *
BUCKET 428: **
BUCKET 429:
BUCKET 430:
BUCKET 431:
BUCKET 432:
BUCKET 433: *
BUCKET 434:
BUCKET 435: **
BUCKET 436: *
BUCKET 437: *
BUCKET 438:
BUCKET 439: *
BUCKET 440:
BUCKET 441:
BUCKET 442:
BUCKET 443: *
BUCKET 444:
BUCKET 445: *
BUCKET 446:
BUCKET 447: *
BUCKET 448:
BUCKET 449: *
BUCKET 450:
BUCKET 451:
BUCKET 452: *
BUCKET 453: *
BUCKET 454: *
BUCKET 455:
BUCKET 456:
BUCKET 457:
BUCKET 458: *
BUCKET 459: **
BUCKET 460:
BUCKET 461: **
BUCKET 462: *
BUCKET 463:
BUCKET 464: *
BUCKET 465: *
BUCKET 466:
BUCKET 467:
BUCKET 468:
BUCKET 469: *
BUCKET 470: *
BUCKET 471:
BUCKET 472: **
BUCKET 473: **
BUCKET 474:
BUCKET 475:
BUCKET 476:
BUCKET 477: *
BUCKET 478:
BUCKET 479: *
BUCKET 480: *
BUCKET 481: ***
BUCKET 482: **
BUCKET 483:
BUCKET 484:
BUCKET 485: **
BUCKET 486: **
BUCKET 487:
BUCKET 488: *
BUCKET 489: *
BUCKET 490:
BUCKET 491: **
BUCKET 492: *
BUCKET 493:
BUCKET 494:
BUCKET 495: *
BUCKET 496:
BUCKET 497:
BUCKET 498:
BUCKET 499:
BUCKET 500: ***
BUCKET 501:
BUCKET 502: *
BUCKET 503: *
BUCKET 504: *
BUCKET 505:
BUCKET 506: *
BUCKET 507:
BUCKET 508:
BUCKET 509:
BUCKET 510:
BUCKET 511:

在Oracle8i中,Oracle以一个很长的LIBRARY CACHE HASH TABLE来记录Library Cache的使用情况
"*"代表该Bucket中包含的对象的个数

在以上输出中我们看到Bucket 198中包含四个对象.

我们在第三部分中可以找到bucket 198:

 

 


BUCKET 198:
LIBRARY OBJECT HANDLE: handle=2c2b4ac4
name=
SELECT a.statement_id, a.timestamp, a.remarks, a.operation, a.options,
a.object_node, a.object_owner, a.object_name, a.object_instance,
a.object_type, a.optimizer, a.search_columns, a.id, a.parent_id,
a.position, a.cost, a.cardinality, a.bytes, a.other_tag,
a.partition_start, a.partition_stop, a.partition_id, a.other,
a.distribution
, ROWID
FROM plan_table a

hash=60dd47a1 timestamp=08-27-2004 10:19:28
namespace=CRSR flags=RON/TIM/PN0/LRG/[10010001]
kkkk-dddd-llll=0000-0001-0001 lock=0 pin=0 latch=0
lwt=2c2b4adc[2c2b4adc,2c2b4adc] ltm=2c2b4ae4[2c2b4ae4,2c2b4ae4]
pwt=2c2b4af4[2c2b4af4,2c2b4af4] ptm=2c2b4b4c[2c2b4b4c,2c2b4b4c]
ref=2c2b4acc[2c2b4acc,2c2b4acc]
LIBRARY OBJECT: object=2c0b1430
type=CRSR flags=EXS[0001] pflags= [00] status=VALD load=0
CHILDREN: size=16
child# table reference handle
------ -------- --------- --------
0 2c0b15ec 2c0b15b4 2c2c0d50
DATA BLOCKS:
data# heap pointer status pins change
----- -------- -------- ------ ---- ------
0 2c362290 2c0b14b4 I/-/A 0 NONE
LIBRARY OBJECT HANDLE: handle=2c3675d4
name=SYS.DBMS_STANDARD
hash=50748ddb timestamp=NULL
namespace=BODY/TYBD flags=TIM/SML/[02000000]
kkkk-dddd-llll=0000-0011-0011 lock=0 pin=0 latch=0
lwt=2c3675ec[2c3675ec,2c3675ec] ltm=2c3675f4[2c3675f4,2c3675f4]
pwt=2c367604[2c367604,2c367604] ptm=2c36765c[2c36765c,2c36765c]
ref=2c3675dc[2c3675dc,2c3675dc]
LIBRARY OBJECT: object=2c1528e8
flags=NEX[0002] pflags= [00] status=VALD load=0
DATA BLOCKS:
data# heap pointer status pins change
----- -------- -------- ------ ---- ------
0 2c367564 2c1529cc I/-/A 0 NONE
4 2c15297c 0 -/P/- 0 NONE
LIBRARY OBJECT HANDLE: handle=2c347dd8
name=select pos#,intcol#,col#,spare1 from icol$ where obj#=:1
hash=fa15ebe3 timestamp=07-28-2004 18:04:43
namespace=CRSR flags=RON/TIM/PN0/SML/[12010000]
kkkk-dddd-llll=0000-0001-0001 lock=0 pin=0 latch=0
lwt=2c347df0[2c347df0,2c347df0] ltm=2c347df8[2c347df8,2c347df8]
pwt=2c347e08[2c347e08,2c347e08] ptm=2c347e60[2c347e60,2c347e60]
ref=2c347de0[2c347de0,2c347de0]
LIBRARY OBJECT: object=2c1cd1a0
type=CRSR flags=EXS[0001] pflags= [00] status=VALD load=0
CHILDREN: size=16
child# table reference handle
------ -------- --------- --------
0 2c1cd35c 2c1cd324 2c281678
1 2c1cd35c 2c352c50 2c0eeb8c
2 2c1cd35c 2c352c6c 2c2bb05c
DATA BLOCKS:
data# heap pointer status pins change
----- -------- -------- ------ ---- ------
0 2c2e8c58 2c1cd224 I/-/A 0 NONE
LIBRARY OBJECT HANDLE: handle=2c3a6484
name=SYS.TS$
hash=bb42852e timestamp=04-24-2002 00:04:15
namespace=TABL/PRCD/TYPE flags=PKP/TIM/KEP/SML/[02900000]
kkkk-dddd-llll=0111-0111-0119 lock=0 pin=0 latch=0
lwt=2c3a649c[2c3a649c,2c3a649c] ltm=2c3a64a4[2c3a64a4,2c3a64a4]
pwt=2c3a64b4[2c3a64b4,2c3a64b4] ptm=2c3a650c[2c3a650c,2c3a650c]
ref=2c3a648c[2c0d4b14,2c09353c]
LIBRARY OBJECT: object=2c3a626c
type=TABL flags=EXS/LOC[0005] pflags= [00] status=VALD load=0
DATA BLOCKS:
data# heap pointer status pins change
----- -------- -------- ------ ---- ------
0 2c3a8ea4 2c3a63b0 I/P/A 0 NONE
3 2c3a5828 0 -/P/- 0 NONE
4 2c3a6300 2c3a5960 I/P/A 0 NONE
8 2c3a6360 2c3a4f00 I/P/A 0 NONE
 

我们看到这里包含了四个对象.

我们再来看看Oracle9i中的情况:

参考文件: hsjf_ora_15800.trc


LIBRARY CACHE HASH TABLE: size=131072 count=217
Buckets with more than 20 objects:
NONE
Hash Chain Size Number of Buckets
--------------- -----------------
0 130855
1 217
2 0
3 0
4 0
5 0
6 0
7 0
8 0
9 0
10 0
11 0
12 0
13 0
14 0
15 0
16 0
17 0
18 0
19 0
20 0
>20 0
 

Oracle9i中通过新的方式记录Library Cache的使用状况.
按不同的Hash Chain Size代表Library Cache中包含不同对象的个数.
0表示Free的Bucket,>20表示包含超过20个对象的Bucket的个数.

从以上列表中我们看到,包含一个对象的Buckets有217个,包含0个对象的Buckets有130855个.

我们来验证一下:


[[email protected] udump]$ cat hsjf_ora_15800.trc |grep BUCKET|more
BUCKET 12:
BUCKET 12 total object count=1
BUCKET 385:
BUCKET 385 total object count=1
BUCKET 865:
BUCKET 865 total object count=1
...
[[email protected] udump]$ cat hsjf_ora_15800.trc |grep BUCKET|wc -l
434
[[email protected] udump]$
 

434/2 = 217,证实了我们的猜想.

通过HASH TABLE算法的改进,Oracle Library Cache管理的效率大大提高.

以上是关于关于shared pool的深入探讨的主要内容,如果未能解决你的问题,请参考以下文章

关于shared pool的深入探讨

关于shared pool的深入探讨

关于shared pool的深入探讨

关于shared pool的深入探讨-高Latch竞争案例

深入探讨Linux静态库与动态库的详解(转)

关于 Session 的深入探讨