- 最后登录
- 2023-8-16
- 在线时间
- 1686 小时
- 威望
- 2135
- 金钱
- 50532
- 注册时间
- 2011-10-12
- 阅读权限
- 200
- 帖子
- 5207
- 精华
- 39
- 积分
- 2135
- UID
- 2
|
3#
发表于 2012-7-9 20:02:06
FOR QUESTION 2:
library cache 中有多种 数据结构 例如handle 、object、pin 、 lock, 这些结构的最终目的是为了 SQL和Pl/SQL对象能够高效共享、并行控制
去读一读上面生成的 TRACE,以下是一个library cache handle
LIBRARY OBJECT HANDLE: handle=9e1f6268 mtx=0x9e1f6398(0) lct=1 pct=1 cdp=0
name=SYS.DIRTY
hash=86961df3fe3ab74e60e27ad5ad4c03c0 timestamp=NULL
namespace=TABL flags=KGHP/TIM/SML/[02000000]
kkkk-dddd-llll=0000-0001-0001 lock=0 pin=0 latch#=3 hpc=0002 hlc=0002
lwt=0x9e1f6310[0x9e1f6310,0x9e1f6310] ltm=0x9e1f6320[0x9e1f6320,0x9e1f6320]
pwt=0x9e1f62d8[0x9e1f62d8,0x9e1f62d8] ptm=0x9e1f62e8[0x9e1f62e8,0x9e1f62e8]
ref=0x9e1f6340[0x9e1f6340,0x9e1f6340] lnd=0x9e1f6358[0x9e1fad78,0x9e1f8de8]
LIBRARY OBJECT: object=999792e0
flags=NEX[0002] pflags=[0000] status=VALD load=0
DATA BLOCKS:
data# heap pointer status pins change whr
----- -------- -------- --------- ---- ------ ---
0 9e28f4c0 999793f8 I/-/A/-/- 0 NONE 00
一个library cache handle指向 library cache object ,object指向这个object的其他heap
library cache中的部分数据来源于row cache, row cache也叫做dictionary cache 即字典缓存,字典缓存来源于 磁盘上数据字典基表中的记录, row cache 的结构与library cache不同, 采用hash buck+ row stored 以行的形式保存:
示例的row cache记录:
BUCKET 368:
row cache parent object: address=0x9dae4b40 cid=17(dc_global_oids)
hash=a4a9ad6f typ=9 transaction=(nil) flags=00000001
own=0x9dae4c10[0x9dae4c10,0x9dae4c10] wat=0x9dae4c20[0x9dae4c20,0x9dae4c20] mode=N
status=EMPTY/-/-/-/-/-/-/-/-
data=
00000000 00000000 00000000 00000000 04000100 00000000
BUCKET 368 total object count=1
BUCKET 384:
row cache parent object: address=0x9da11640 cid=17(dc_global_oids)
hash=11aae37f typ=9 transaction=(nil) flags=00000001
own=0x9da11710[0x9da11710,0x9da11710] wat=0x9da11720[0x9da11720,0x9da11720] mode=N
status=EMPTY/-/-/-/-/-/-/-/-
data=
00000023 00000000 00000000 00000000 02000100 00000000
BUCKET 384 total object count=1
BUCKET 386:
row cache parent object: address=0x9dae4d70 cid=17(dc_global_oids)
hash=60dfb381 typ=9 transaction=(nil) flags=00000002
own=0x9dae4e40[0x9dae4e40,0x9dae4e40] wat=0x9dae4e50[0x9dae4e50,0x9dae4e50] mode=N
status=VALID/-/-/-/-/-/-/-/-
data=
00000001 00000000 00000000 00000000 11000200 00001098
BUCKET 386 total object count=1
BUCKET 480:
row cache parent object: address=0x9db88828 cid=17(dc_global_oids)
hash=3accafdf typ=9 transaction=(nil) flags=00000001
own=0x9db888f8[0x9db888f8,0x9db888f8] wat=0x9db88908[0x9db88908,0x9db88908] mode=N
status=EMPTY/-/-/-/-/-/-/-/-
data=
00000000 00000000 00000000 00000000 01000100 00000000
缩写DC 意为dictionary cache
SQL> select distinct cache_name from v$rowcache_parent;
CACHE_NAME
----------------------------------------------------------------
dc_tablespaces
dc_awr_control
dc_rollback_segments
dc_usernames
dc_sequences
dc_segments
dc_objects
dc_database_links
dc_histogram_defs
dc_users
outstanding_alerts
CACHE_NAME
----------------------------------------------------------------
dc_object_ids
dc_profiles
dc_global_oids
14 rows selected
DC 字典缓存按照功能的不同 可以分成 许多种 如上,
dc_sequences sequence 序列的字典缓存
dc_usernames 用户名的字典缓存
字典缓存的信息 一般都是数据库实例频繁访问的, 所以ORACLE特殊区别这部分meta源数据 并以row data的形式缓存在共享池中,这样避免了频繁的递归调用去buffer cache中访问这些源数据 |
|