上一篇 / 下一篇 2007-12-08 00:00:00 / 个人分类:Oracle数据库管理
2.调整shared pool size应该考虑什么
z2G6c#A,T#w0 由于库缓存和数据词典缓存的miss引起的操作时间往往比SGA中其他组件的cache miss要多,因此在SGA中
D)_wJz ZzQD0首先应该考虑调整shared pool。而当调整shared pool时,则应该首先集中在库缓存上,因为库缓存的大小和数 ITPUB个人空间Z V~$r#C U
据词典缓存的大小没有单独的设置,而是oracle自动按照一定的算法在shared pool中分配给他们,而按照oracle
p dN y*c/r7o Z$Rcc0的内存空间分配的算法,如果库缓存的命中率高的话,数据词典缓存的命中率也会较高的;库缓存的命中率高而数 ITPUB个人空间-Z9U5iS#uj
据词典缓存的命中率却很低的话几乎是很少的。
_OM;M`9DfM)ee0 如果共享池很小,这往往会消耗很多CPU资源并且容易引起竞争;但是如果你把共享池设到很大,也不一定
a#rKo$Z(Pk0是好事,那为什么呢?当你把共享池配得很大,是不是消耗了很多内存资源那,那么其他得组件能使用得内存 ITPUB个人空间)y r%K"u/eG,ur0\
资源是不是就少了,另外,在这个很大的大池中,缓冲的内容是不是很多啊,多了,在里面查找是不是就慢了。
F7pmZf^F4Qb0所以说共享池虽然不能很小,但是也不是越大越好,还是要适当。
3. 共享池相关 ITPUB个人空间w2E"u1AJ+O3c
/这个共享池是由初始化参数SHARED_POOL_SIZE来定义的,默认是8M,这个参数是动态的 ITPUB个人空间i@ t8}`'l
/库缓存的内容 ITPUB个人空间)vca"Z'l\h
包含了Statement的文本, 分析后的Code, 以及相应的执行计划 ITPUB个人空间5DOR u(G9CY i
/数据词典缓存主要是system中的数据词典表(对象的列定义信息,用户的权限信息等)
4. 库缓存 ITPUB个人空间fZ|CF oDW:^
/用来缓存共享的SQL statements 和PL/SQL块,这些可以给所有的连接用户共享。
;l:cBG l)S,Q XW0 /由LRU(最小使用最先淘汰算法)来管理, 千万不要以为是FIFO(先进先出)算法管理的
:i/ahs2o$yh3m7I6\G0 /oracle server怎样知道你要执行的Statement等被缓存了呢?
/Y|*h'Oc@&_!U:a]0 --先通过一个hash算法将Statement text运算成一个hash数值 ITPUB个人空间 a }~,gC$TWdd
--然后通过这个hash值去找
5 几个重要的共享池相关的锁存器(latch)
j%Nht_I0 /latch也是一种锁,但是是一中由oracle server自行管理的用来保护共享的内存结构的低级锁(low lock),
h-eb/ww `$W0 和后面章节讲的LOCK是由区别的,latch不用我们来维护。
H.ak9cC0 /share pool latch: 用来保护共享池中的内存分配
X4B6?'@%dU!O&_0 /libray cache latch: 在shared pool中查找匹配的SQL等是起到保护作用,保护在查找的短暂过程中这个列表不会被改变
lK)x#n7Y`PL4Y0 什么时候会改变,由于oracle server可以同时被很多用户连接使用,在这个过程中很由可能会由新的SQL进来,而把老的
S&oL DaZ8znJ ]0 很少用的SQL给恰巧挤出去了,而我要找的就是这个很少用的SQL时那可能不就出问题了吗,这个latch能够保证在查找的 ITPUB个人空间'Tj k(}7Ld]
这个过程中不会出现这个问题。
-Mt6p.p&N0 而在这些latches上如过由竞争的话,表示SQL、PL/SQL被重用的机率很小,可能是因为没有使用绑定变量或者设置的游标
tNBP x.`0 缓存的数量不够多。那么要减少这种竞争,我们又该怎么做呢?我们可以考虑什么原因引起的,然后用什么对策。 ITPUB个人空间6jm Mu[N}iF9Gl,u
引起竞争的原因:没有共享的SQL(没有使用绑定变量), 共享SQL重新硬分析了(可以查询V$sqlarea中的parse_calls和
'TMWQ.AKfB)G0 excutions字段,如果某个SQL对应的parse_calls接近excutions,说明这条SQL经常被重新硬分析),库缓存的大小不够
`!cPO aN0 根据上面的这些因素,我们可以考虑调整下面几种情况来减少竞争的发生,理想情况是减少到0啦。
"Y4]g*qd e0 优化您的SQL, 检查"热点块(hot blocks,同时访问的人多)", 调整CURSOR_SHARING参数的值,增大shared_pool_size ITPUB个人空间%l/kls0tR*z0t
如果使用了需要大池的操作而没有配置大池,可以配置大池(比如共享模式,可以把UGA从shared pool移到large pool)
6 调整库缓存目标 ITPUB个人空间/l8t)D~~/U wSu8S
/保持最小次数的分析,尽可能减少丢失,如何做: ITPUB个人空间w2q}:VB!j:io.s
--确保用户能够共享statement ITPUB个人空间y%[;t)W(ld|u
--分配足够的空间保证statement尽可能的不被赶出去 ITPUB个人空间%jLM jb ]:K
经常要用的statement要保证他们能够呆在share pool里被找到
{*bZ+Is z,q)E0 --避免invalidations(由于数据字典发生变法而引起的Statement失效叫invalidations,比如改变了数据结构,重新收集了统计等)
uK)p'sh g2q/Vx)D0 /避免碎片,这样会浪费空间 ITPUB个人空间QMQi*iB
--为大内存要求的对象(比如大于1万byte的SQL) 保留空间,由对应的参数设置 ITPUB个人空间RIk d }W+SF L1z
--栓住那些场用的大对象,最好是在instance一移动,马上就把他们keep到shared pool中
3vwh&d;D H t0 --尽可能的不要使用匿名PL/SQL块(把他们写成一些小的包中的存储过程或函数)
aGjR lW[)\$p.D0 --为shared server连接配置大池
7. 术语 V$libaraycache ITPUB个人空间'KU$uOIXZ
/命名空间:SQL AREA, TABLE/PROCEDURE, BODY, TRIGGER 等 ITPUB个人空间8b^;P5\|r3y K"tf
/gets: (parse)每当一条语句被分析一次时,该语句对应的名称空间的gets加1 ITPUB个人空间.L{!AW}Ak
/gethits : 分析时在对应的名称空间找到已经存在时加1,其分析后的代码和执行计划在内存中找到了,不再执行硬分析,直接使用
SQ.X\#ar;?0 /pins: (excution)每当一条语句执行一次时,该语句对应的名称空间的的pins加1
_ ]\.kSq0 /reloads: (parse)因为找到的分析代码版本已经过期或作废而被重新硬分析的次数
(zhXx+w-ic0 /invalidations: 因为数据词典发生变化,该语句被标记成失效,被迫重新做硬分析的次数 ITPUB个人空间#p6s^KC
对于每一个命名空间,在v@librarycache中会有一行与其相对应,可以分析每一个命名空间的get命中率和reloads(丢失率),
&e$M_y&~5[ K0这两个比例对监控优化library cache非常有用。
K5G0j|e(L`08. 库缓存相关的诊断工具 ITPUB个人空间?%n~gP'TRs{~'{
/v$sgastat 可以显示所有SGA组件的大小 ITPUB个人空间T6q rQZH8BV
/v$librarycache 关于library中对象的统计信息,非常重要
c,WW0XQ:n0 /v$sql 可以查看cursor,parent SQL text, child of the origial SQL ITPUB个人空间7Ry;B9@ o$D
这里介绍以下child cursor ITPUB个人空间b Zx,{k*G _
user A: select * from tblA
-s B4G/KuU B0 user B: select * from tblA ITPUB个人空间gc v(h8j0ZkF
大家认为这两条语句是不是一样的啊,可能会有很多人会说是一样的,但我告诉你不一定,那为什么呢? ITPUB个人空间\7A!DS'^)p`S
这个tblA看起来是一样的,但是不一定哦,一个是A用户的, 一个是B用户的,这时他们的执行计划分析代码 ITPUB个人空间.lc5\8T+St
差别可能就大了哦,哈哈,如果前面加了限定大家就明白了: select * from A.tblA,select * from B.tblA ITPUB个人空间:MF ])y;kt
这是不一样,当然前面不加限定的也可能是一样的。 ITPUB个人空间K.~4K~GG
/v$sqlarea: 这个数据表相当与对v$sql做group by 了,并且和v$sql一样每条只可以看到1000个字符
)`)Oxt'ny(J8a j0 /v$sqltest: 这个试图可以查看Sql等的全部内容啦,分行的哦
Y K$f9V&w m7|%h0 /v$db_object_cache: 显示缓存的对象,包括对应的namespace,type和gets,pins等统计信息 ITPUB个人空间'q5yl:M/Iyo
/相关初始化参数:shared_pool_size, open_cursors, session_cached_cursors, cursor_space_for_time ITPUB个人空间+S0ps[4Q_*S
cursor_sharing, shared_pool_reserved_size
;XmH3@#m0 /statspack等工具
9. 是否共享了Cursor
} fS1j*};tO0 /查询V$librarycache,检查SQL AREA的gethitratio ITPUB个人空间/}7w?%G([
select gethitratio from v$libararycache where namespace='SQL AREA';
g4d3u%R;nO'I3cMU0 这个命中率 = gethits/gets, 表示软分析次数与分析次数的比值 ITPUB个人空间9\*b:u S EF3w0O,y)tJ
OLTP系统应该>=90%,如果<90%,你可能需要 ITPUB个人空间Kmj:b k(F0F2rq
--改写你的应用程序中的Statement了,提高效率。但往往你可能无法去调整应用程序的代码,因为你没有。
*xt9S1D$B0 --增加共享池的大小 ITPUB个人空间QU Rg+HdGmz
--调查那些SQL正在执行 ITPUB个人空间qc%iz4z6h,p*OJ
select sql_text, users_excuting,executions, loads from v$sqlarea; ITPUB个人空间H1KA"dZe\
--users_excuting查询的时候,正在执行的次数 ITPUB个人空间{6_d t#URGL
--excutions 总的执行次数 ITPUB个人空间.d~5O6C&v;O"q
--loads 这个数值越低越好
c kD ~2\ ue0 select * from v$sqltext where sql_text like 'select * from hr.employees where %';
10. 共享游标
H'?NZp%G"jk0 /初始化参数 CURSOR_SHARING,有三个取值:exact, similar, force
Hwf,I]3R0 --exact 默认值,2个sql语句必须完全一样才共享缓存中的已分析代码 ITPUB个人空间 Ir@D+@7zrV~
--similar 当2个sql仅只有参数变量值不一样而结构完全一样时,而且执行计划一样就共享
:J,W2y(f"`HG0 --force 当2个sql仅只有参数变量值不一样而结构完全一样时也共享,不考虑执行计划的影响,比如 ITPUB个人空间cDcM'V1J F^L
select * from employees where employee_id=1000; ITPUB个人空间e5h+W@O[t
select * from employees where employee_id=1234; ITPUB个人空间?fw.m?\{H
11. 准则:库缓存的丢失率(reloads) ITPUB个人空间6d6r9Q BZ/U4|OQ
/reload应该小于PINS的1% ITPUB个人空间4S;S!RI$_^
select sum(pins) "executions", sum(reloads) "cache misses",
D)n&C'X(BL0 sum(reloads)/sum(pins) from v$libararycache;
8F|wc3JB0 /当其>1%时,有两种可能的原因
*F5er QBp F;q0 --因为没有空间了,曾经分析执行过的代码被赶出去了,对策:增加shared pool大小,当然SGA要有空闲空间 ITPUB个人空间8kaG#H ol
--共享的代码 invalidated了
&^kw6H7R_0 对策:避免在高负荷时修改数据结构和收集数据统计,创建索引等,把这些工作调整到负荷低的时候去做
12. 调整库缓存 ITPUB个人空间ka@ f?Q:x
/当gethitratio<90%或丢失率>1%时,就需要优化 ITPUB个人空间u d] lyuC7q n
/对于频繁要用的PL/SQL包,触发器,sequence,永久将他们缓存在内存中
'G#San+Q2w0 /为常用的SQL定义足够的内存
2{1?I*k;B+J!} l0 /为大内存需求的对象保留空间,这样可以避免碎片(碎片会导致这些内存不可用而浪费) ITPUB个人空间!Xm+O C'e"`%l7D
/栓住那些常用的对象 ITPUB个人空间Z v#e_-L N-C
/将大的匿名PL/SQL块改写成小的包函数
U8wWwlE(N%X x0 将匿名PL/SQL块改写成存储过程,不管他们是大还是小的匿名块
13. 共享池建议
6W;n&Dbx7x0 可以通过OEM来查看oracle server建议的共享池大小,也可以查询视图
zf"n"t*F*o0 select shared_pool_size_for_estimate as pool_size, estd_lc_size,estd_lc_time_saved from v$shared_pool_advice; ITPUB个人空间o}z~\7l
shared_pool_size_for_estimate:表示估计的共享池大小,取值范围,当前库缓存大小的50---200%,每个估计值一行
&h-\1_bg+nr0 estd_lc_size: 对应分配的library cache大小,
_q-S8g1Xf"h x0 estd_lc_time_saved: 估计的能保留的时长
c#N;_r7u0s%Z;d&B w.Q4\0 怎么决定库缓存的大小呢,当estd_ls_size增大时,estd_lc_time不再发生变化时,我们取第一个这样的share_pool_size_for_estimate作为我们的共享池大小。
14. 执行计划
1r t]%w4r*U{0 /oracle server把SQL解析执行过的执行计划缓存在内存中,供下次共享使用,而不必再执行一次硬分析,直接找到相应的内存中的执行计划来执行SQL
8w,k0\:P(o~0 /当SQL在内存中被淘汰,相对应的执行计划也会被请出libarary cache ITPUB个人空间-fV$J8H9^:hRy6P(})l%q
/这个特性最主要的好处就是能更好的诊断查询执行效率
&?6Omz^M3~g4S0 /怎样查询SQL的执行计划
1qQ#f.Z|/`!Y)M0 select operation,object_owner,object_name,cost from v$sql_plan order by hash_value
*w`!r8`)PGD V8D5k2U0 /在v$sql视图中有一列hash_value(书上错:不应该是书上说的plan_hash_value)和v$sql_plan的列hash_value相对应
4e-FR'H MO r9@0 /hash_value还可以用来比较Cursor SQL TEXT是否相似
15 计算Global Space
w/N,p`OMm,^0 /计算存储对象需要的空间大小,比如包,函数,存储过程 ITPUB个人空间pE;oC5e
select sum(sharable_mem) from v$db_object_view ITPUB个人空间*b4Z5j-dc'n ];Q6A
[where type in ('PACKAGE','PACKAGE BODY','PROCEDURE','FUNCTION')] ITPUB个人空间R6q Aq9Z
/计算经常执行的SQl需要的空间大小
-W J4M ` NRv`@0 select sum(sharable_meme) from v$sql_are where execution>5 ITPUB个人空间VK8A:l&W
/计算高峰时所有打开游标需要的空间,假如每个用户每个游标的最大允许大小是250B
:J2r8p^6LC*gp0 select sumI(250*user_opening) from v$sqlarea ITPUB个人空间nHl9q%m;uz.Sp
/理想状态下,您的生产环境的library cache应该是这些数字之和,并且加上一定的缓冲大小
C&Qd:B6G&pJu`{0 /在测试环境中,你也可以用一个典型用户来计算可能需要需要的平均游标空间, ITPUB个人空间c@!v'N:|
select 250*value bytes_per_user from v$sesstat s, v$statname n where s.statistic$=n.statistics# ITPUB个人空间[fj:JB
and n.name='opened cursors curent' and s.sid=15;
16. 大内存需求(oracle自身运行的大程序段,package等,超过1万byte的程序段)
]k+u\)YU0 /有大的连续内存满足需求
I0S4{Kw0 /在共享池中为他们保留一定的连续空间 ITPUB个人空间&z2h T!HuCK*f
/V$shared_pool_reserved视图中的列说明
)x$`B~8_v3Sp0 --free_space: 保留空间列表中所有的空闲空间 ITPUB个人空间 {/?hCQ?U(Q
--Avg_Free_Size: 保留空间列表空闲内存的平均值 ITPUB个人空间3X2M#KAQ~9?
--Max_Free_Size: 保留空间列表空闲内存的最大值
"tY:UFo0 --Request_misses:因为没有一个满足需求的连续空闲内存,LRU列表不得不flush对象来满足请求的次数
V r[c%MB0 --request_failuers: 没有空闲空间导致请求失败的次数
]2m%Z&c ]e0 --last_failures_size:最后一次请求失败需要的内存大小
7j_YH4o0 --其他 ITPUB个人空间1n7F*z]m,WP
/初始化参数:shared_pool_size ITPUB个人空间,|;k3E,hH2[ VY$N
shared_pool_reserved_size 一般为share_pool_size的10%, 是shared_pool_size的一部分,不是另外开辟一块内存 ITPUB个人空间tkFgz%Y
最大值是share_pool_size的50%, 大于50%会报错
17. 调整共享池保留空间
{-Jl YReH0 /诊断工具 V$shared_pool_reserved ITPUB个人空间&A W;WS'D[7u
--在一个有足够空闲内存的系统,调整的目标是 request_misses=0
Q+H7u t"qK-j`0 /通过dbms_shared_pool_pachage.aborted_request_threshold过程来设置一个阀值
+kWLB D*w\\/?i0 比如有个包在reserver中请求2M空间,reserver会去找一个2M的连续空间出来,一般情况下,如果没有则会请出一些对象以获得这2M内存,但是你可以设置一个阀值比2M小一点,那么不管有没有2M或者以上的空闲内存,就都不会让2M及其以上的对象进来
V4L5B8D2K"AT)b0 /设置初始化参数shared_pool_reserved_size
5`8J&d|)Vv4M}0 ---当shared_pool_reserved_size太小,可以适当增大他的大小 ITPUB个人空间"V#h,r+N5sV
--当他太大,以下任何一种情况满足应该适当减小shared_pool_reserved_size的值
'v6` J7B$jX5F1f0 /request_miss=0或者保持一个值而不再增大是,可以减小shared_pool_reserved_size到一个适合这个情况的最小值, ITPUB个人空间w{;~-B oZ2wXzXY
释放出不必要的内存给其他的人用
-E*j LnYZ,B0 /shared_pool_reserved中如果Free_space 大于其50%时
VF l @;z#|5a0x Ey0 /shared_pool_size太小时 ITPUB个人空间X@5D5WR~D*kX
使用V$shared_pool_reserved也可以诊断出shared_pool_size太小,这是request_failuer>0并且持续增大的一个原因,这个时候,如果 ITPUB个人空间'n+A!e leAs
你已经启用了the reserved list,那么减小shared_pool_reserved_size的大小,如果没有,则要增加shared_pool_size的大小。 ITPUB个人空间4P2g$X Dw
ITPUB个人空间pC@0LT9[
18. 在共享池中栓住大对象 ITPUB个人空间LJ[ ^)O W:j|7c'vi"R
/调查库缓存中那些大对象没有被栓住, 比如大于1万字节的
/c"CoV.fZs0 select * from v$db_object_cache where shareable_mem>10000 ITPUB个人空间*E6W ~(J(] Iv]1rv
and kept='NO' [and type in ('PACKAGE', 'PACKAGE BODY', 'FUNCTION','PROCEDURE')]
3i1h9J-e)R{0?0 /用什么工具来栓住他们到共享池中,用dbms_shared_pool.keep(package_nem)这个包过程 ITPUB个人空间 u jM#yG[
现在我们应该知道为什么要栓住这些大对象吧,如果不栓住这些大对象,在加载到库池时极容易引起内存碎片,为了能够获得足够的连续空间,甚至需要将大量的小对象从共享池中赶出去,这样将会导致命中率低,响应用户的时间增加,对不对啊!为了避免这种糟糕的情况发生,我们就有必要以启动instance,就先栓住这些常用的大对象,这样他们可以一直保存在内存中,也不再去和那些小对象去抢空间了。
4h&{;DXg K"Z'P m0 /那些对象应该被栓住 ITPUB个人空间*o{"qZ ztGl
--经常需要的大的存储过程,比如standard包,diutil包以及那些超过定义的阀值的常用的大对象 ITPUB个人空间ku\,?#B
--使用频率很高的那些表对应的触发器 ITPUB个人空间:r(VaVei
--序列sequence, 缓存起来可以增加响应的速度,(创建sequence有一个cache N从句,可以一次生成多少个值缓存起来) ITPUB个人空间q ~NTy!qZ7o|
/什么时候栓住他们最好
Ne)CV h'x+k8~R0 在前面我已经提到过好几次了,大家想起来了没有。在instance一起来就把他们栓住。
M}7@?"r(V1rD0 /凡是被栓住的对象,即使你执行alter system flush shared_pool;时也不会被赶出去,还在里面,是不是很有好处啊?
19. 匿名PL/SQL块 ITPUB个人空间P'^CyRrwn
/怎样找出匿名块,找到后该怎么优化 ITPUB个人空间,|H9ZKG
--查询视图v$sqlarea中command_type=47的SQL,这个就是匿名块,比如
&EW0i+MX:w'Y$E0 select sql_text from v$sqlarea where Command_type=47 and length(sql_text)>500 ITPUB个人空间a5caMUVJpQ
--一般来说找到他们后尽可能的把他们转换成小的包函数,但是如果不能转化又怎么办,那就把他们栓住啊, ITPUB个人空间MuD5p_E*a~
比如,步骤如下: ITPUB个人空间p([g P8Gp
1) declare x number declare /* KEEP_ME */ x number
S ?4O8K,K-w'Y/D0 begin x:=5 -------------> begin x:=5; ITPUB个人空间*B{}%x{V
end; end; ITPUB个人空间8Qx*ZB"UMq
2) select address, hash_value from v$sqlarea where command_type=47 and sql_text like '%KEEP_ME%';
N(w"JL4D0`$]0 3) execute dbms_shared_pool_keep('address,hash_value');这里'address,hash_value'是上面查出来的值啊
20. 影响库缓存的其他一些参数
9jI/A$D4R k|0 /open_cursors 50(default)|n ITPUB个人空间9]v8K4M O H
这个参数定义了在用户进程的私有(不共享)SQL区域最多能打开的游标数量,对于中型应用一般设为300 ITPUB个人空间(W*EDqTY5X!x;I _
/Cursor_space_for_time false(default)|true ITPUB个人空间1t7|wM5ST7Q
表示是否缓存cursor, true能够提高命中率,但增加负荷,慎重,那什么时候可以改为true呢?
&]o,UI`} o$d|k0 因为设置为true, 你是那空间来换时间,如果你有足够的内存,能使V$librarycache中reloads等于0或者趋近0的时候,你当然可以设置为true.
(X"ua#rrzAf[ ?0 如果你的应用使用了oracle forms和任何动态SQL, oracle建议保留默认值false
(m Q_9?!I8mu0 /session_cached_cursors 0(default,不缓存)
B{9P M-u{7v0 如果应用程序是form型的,将这个值设为true,可以改进库缓存的命中率,因为窗体中所包含的SQL语句将被缓存,当窗体来回切换时可以减少重分析的次数。 ITPUB个人空间 OePf:F-\O5Q
/Cursor_sharing exact|similar|force
EO y)u:d~Ko0 这个前面已经详细介绍过,这里不再介绍了,大家如果不清楚可以翻看前面。 ITPUB个人空间e~nC6Am[qH4B
ME2K"M4\;v4g9GTGl021. 调整数据词典缓存
1EU7s1u-N0 前面我们一直在讨论的是库缓存,大家知道,共享池中还有一个很重要的组件,那就是数据词典缓存。这讲开始我们开始讨论这个问题。
,l ^fl _ sg-c X)^0 /存放的内容:数据对象的定义 ITPUB个人空间v.Xfp6N.g
/使用v$rowcache视图可以得到数据词典缓存中的信息,主要有了解三个列 ITPUB个人空间$@$g!t,I:j
--paramter: 缓存中数据词典的名称 ITPUB个人空间N#DQ4w LixUB
--gets: 请求的总次数
3X)f0[2A.tKQ ^u&b pd0 --getmisses: 请求时没有在缓存中找到的次数,丢失 ITPUB个人空间h3EZY/XM
/优化目标:避免丢失,提高命中率, 丢失率:getmisses/gets
6ceN%oO ew0 /要调整数据词典缓存大小,只能通过改变shared_pool_size参数来调整
)r;K[3t'Y5d-R{0 /在实例刚起来的时候,由于数据词典缓存中没有数据,所以任何执行的SQL第一次都需要从磁盘文件加载数据词典,产生缓冲丢失。但是,随着数据库稳定持续的运行,常用的数据词典对象就应该缓存到了内存中,在这个时候,缓存丢失发生的几率就应该很小。为了调优数据词典缓存,应该实在应用已经稳定持续运行了一段时间,而不是instance启动的时候。
22. 怎样测量数据词典性能
&n%~4a9y9c'w5v"{0 /V$rowcache
TCFP#G X f4O0 /比较重要的每行的丢失率应该小于2%, 整体丢失率应该小于15%
ua$q-n2U)ME0 --单个/每行
ExK#blO4yz0 select parameter, getmisses, gets, (getmisses/gets)*100 "miss ratio %" from v$rowcache;
u eQ3h] n]0 --整体丢失率和命中率
0Rck4`!{3k0 select sum(getmisses)/sum(gets)*100 "miss ratio %", ITPUB个人空间-QeCf,b4t/UB$]iY
(1-sum(getmisses)/sum(gets))*100 "Hit ratio %" ITPUB个人空间W7f U O*h5\ f#J
from v$rowcache; ITPUB个人空间&~]Q/{5X(t"tB9_l"n
--如果丢失率高,说明共享池小,需要调整共享池大小 ITPUB个人空间 |*l&W~eV
/statspack报告中的 dictinary cache stats 部分,丢失率应该比较低,高说明有性能瓶颈
R _jE'w0 例 cache get Pct ........ Pct
F([ R9t E c&y0 requests Miss SGA
*@ T tU PAA(\6b#[@0 ------------------------------------------------------------- ITPUB个人空间8p,? tq5E z4a/Li)H
dc_free_extent 4 0.0 88 ITPUB个人空间eY_"}T!rZe
............. ITPUB个人空间a2Q f*w\,R*B O
dc_usernames 28 3.6 81
)L,c ayd3o0mX0 dc_users 45 0.0 86
i%G'q8l5q/u9e0 Pct Miss表示丢失率,pct SGA表示为对应cache分配的内存空间的使用率
IKLS} } |\`0 如果pct SGA和pct Miss都大的话,说明请求数高,并且丢失率也高,也就是暗示共享池太小。 ITPUB个人空间!J?[q6au/^
/调整,如果丢失率高的话,我们就需要考虑增加共享池的大小了
j"l0m U? P0 alter system set shared_pool_size = 更大的值 scope=both|memeory|spfile; ITPUB个人空间Oh(I(uuYQ![#d+D
/由于实例刚起来的时候缓冲中没有数据,所以丢失率不可能等于0,随着持续稳定的运行,我们希望他趋近于0
M3`-I;Sa:K/vYvy,c0 /oem工具:performace manager-->shared pool statistic
n&jXMC4T$v o*}0 --memory: SGA Overview ITPUB个人空间%[l'E$J4U/@K*l
--Database Instance: libary cache Hit % ITPUB个人空间*S(B-H ]H9a&pX/E
--top sessions: top session
23. UGA和ORACLE共享服务器
9b#T_bk"g6X0 前面我们讨论了库缓存和数据词典缓存,下面我们来了解一下UGA和oracle共享服务器 ITPUB个人空间Fbkg4N!@,x`\
/专用服务器下,我门知道每个用户进程都有一个PGA, PGA用于存放:
4YjgZ h0 用户会话信息,游标State, 私有SQL区域/Sort Area,堆栈 ITPUB个人空间#z5~:R r*^{l.VG5A,sC
/共享服务器,PGA依然存在,但只有堆栈数据了,其他的几个内容都被放到UGA区域了,
"t"CA7tT-X-?$_0 UGA对server process来说是共享的,不是为那个单独服务的,而PGA是一个server process一个单独的
n.b.N+X1j.X nb"Md0 --UGA到底放在那里呢,如果配置了大池则放在大池里,如果没有配置大池,就会在共享池中抢一块空间出来
(HQb6C!LS0 /使用共享服务器时,能够节省内存空间,UGA+所有PGA的大小要小于专用服务器下所有PGA的大小
24. 计算UGA使用的大小
G&w'I.|G*Z9D JC;?0 /计算你的连接的UGA大小 ITPUB个人空间y*}jRQ+IP;F{b'p
SELECT SUM(value) ||'bytes' "Total session memory" ITPUB个人空间\]kZr3V7L
FROM v$mystat, v$statname ITPUB个人空间c1F E9_(P[
WHERE name = 'session uga memory' ITPUB个人空间(yMC |aB4~E
AND v$mystat.statistic# = v$statname.statistic#; ITPUB个人空间;\+|U0BE k6kM3A
--mystat 仅只有你自己当前会话的信息
E(_6{T%iU"sq0 /计算共享服务下所有用户使用的UGA大小 ITPUB个人空间,y+C!`x{L%m P] `a
SELECT SUM(value) ||'bytes' "Total session memory"
Y*}kA[i,kI-Q&mV(E0 FROM v$sesstat, v$statname ITPUB个人空间x6pjG4lH L
WHERE name = 'session uga memory' ITPUB个人空间N'S:eDO j/@uu
AND v$sesstat.statistic# = v$statname.statistic#; ITPUB个人空间4d|(mAd2x/T+j
/计算UGA曾经用到的最大空间 ITPUB个人空间.W!Xx4i@ T&o
SELECT SUM(value) ||'bytes' "Total max memory"
Ga:`@h0 FROM v$sesstat, v$statname ITPUB个人空间2bi1]`*Uu.q
WHERE name = 'session uga memory max'
_s_UW[0 AND v$sesstat.statistic# = v$statname.statistic#;
25. 大池 large pool ITPUB个人空间Q[7hZ.P:Y pi\,Aw
这一讲的最后我们来说说大池,其实我们前面已经有很多地方提到过了他,相信大家还记得。 ITPUB个人空间L3pJ]0u2R
/什么时候用大池呢
b PgNsf0 --OS不支持异步I/O,为了提高DBWn的速度,使用IO奴隶(DBWR_IO_SLAVES),不过现在的操作系统基本上都支持异步I/O,所以很少使用 ITPUB个人空间2jV\e9kN
--使用RMAN备份和恢复操作 ITPUB个人空间oyk1X*Mr(]
--共享服务器的UGA(session memory)
|,X-h;s8S s3M I0 --并行查询
?'d JQPE#P8K0C0 /由参数large_pool_size参数来调整大小,也是动态参数 ITPUB个人空间4r&P s4F l5_+F
/在共享服务器模式下,设置大池,UGA会从Shared pool中移到大池中,这样可以把共享池的内存留给库池和数据词典用,这样可以避免 ITPUB个人空间+\H? Iykb*rn#i
共享的SQL由于空间不够而被赶出去和额外的空间争用。