19. 匿名PL/SQL块
/怎样找出匿名块,找到后该怎么优化
--查询视图v$sqlarea中command_type=47的SQL,这个就是匿名块,比如
select sql_text from v$sqlarea where Command_type=47 and length(sql_text)>500
--一般来说找到他们后尽可能的把他们转换成小的包函数,但是如果不能转化又怎么办,那就把他们栓住啊,
比如,步骤如下:
1) declare x number declare /* KEEP_ME */ x number
begin x:=5 -------------> begin x:=5;
end; end;
2) select address, hash_value from v$sqlarea where command_type=47 and sql_text like '%KEEP_ME%';
3) execute dbms_shared_pool_keep('address,hash_value');这里'address,hash_value'是上面查出来的值啊
20. 影响库缓存的其他一些参数
/open_cursors 50(default)|n
这个参数定义了在用户进程的私有(不共享)SQL区域最多能打开的游标数量,对于中型应用一般设为300
/Cursor_space_for_time false(default)|true
表示是否缓存cursor, true能够提高命中率,但增加负荷,慎重,那什么时候可以改为true呢?
因为设置为true, 你是那空间来换时间,如果你有足够的内存,能使V$librarycache中reloads等于0或者趋近0的时候,你当然可以设置为true.
如果你的应用使用了oracle forms和任何动态SQL, oracle建议保留默认值false
/session_cached_cursors 0(default,不缓存)
如果应用程序是form型的,将这个值设为true,可以改进库缓存的命中率,因为窗体中所包含的SQL语句将被缓存,当窗体来回切换时可以减少重分析的次数。
/Cursor_sharing exact|similar|force
这个前面已经详细介绍过,这里不再介绍了,大家如果不清楚可以翻看前面。
21. 调整数据词典缓存
前面我们一直在讨论的是库缓存,大家知道,共享池中还有一个很重要的组件,那就是数据词典缓存。这讲开始我们开始讨论这个问题。
/存放的内容:数据对象的定义
/使用v$rowcache视图可以得到数据词典缓存中的信息,主要有了解三个列
--paramter: 缓存中数据词典的名称
--gets: 请求的总次数
--getmisses: 请求时没有在缓存中找到的次数,丢失
/优化目标:避免丢失,提高命中率, 丢失率:getmisses/gets
/要调整数据词典缓存大小,只能通过改变shared_pool_size参数来调整
/在实例刚起来的时候,由于数据词典缓存中没有数据,所以任何执行的SQL第一次都需要从磁盘文件加载数据词典,产生缓冲丢失。但是,随着数据库稳定持续的运行,常用的数据词典对象就应该缓存到了内存中,在这个时候,缓存丢失发生的几率就应该很小。为了调优数据词典缓存,应该实在应用已经稳定持续运行了一段时间,而不是instance启动的时候。
22. 怎样测量数据词典性能
/V$rowcache
/比较重要的每行的丢失率应该小于2%, 整体丢失率应该小于15%
--单个/每行
select parameter, getmisses, gets, (getmisses/gets)*100 "miss ratio %" from v$rowcache;
--整体丢失率和命中率
select sum(getmisses)/sum(gets)*100 "miss ratio %",
(1-sum(getmisses)/sum(gets))*100 "Hit ratio %"
from v$rowcache;
--如果丢失率高,说明共享池小,需要调整共享池大小
/statspack报告中的 dictinary cache stats 部分,丢失率应该比较低,高说明有性能瓶颈
例 cache get Pct ........ Pct
requests Miss SGA
-------------------------------------------------------------
dc_free_extent 4 0.0 88
.............
dc_usernames 28 3.6 81
dc_users 45 0.0 86
Pct Miss表示丢失率,pct SGA表示为对应cache分配的内存空间的使用率
如果pct SGA和pct Miss都大的话,说明请求数高,并且丢失率也高,也就是暗示共享池太小。
/调整,如果丢失率高的话,我们就需要考虑增加共享池的大小了
alter system set shared_pool_size = 更大的值 scope=both|memeory|spfile;
/由于实例刚起来的时候缓冲中没有数据,所以丢失率不可能等于0,随着持续稳定的运行,我们希望他趋近于0
/oem工具:performace manager-->shared pool statistic
--memory: SGA Overview
--Database Instance: libary cache Hit %
--top sessions: top session
23. UGA和ORACLE共享服务器
前面我们讨论了库缓存和数据词典缓存,下面我们来了解一下UGA和oracle共享服务器
/专用服务器下,我门知道每个用户进程都有一个PGA, PGA用于存放:
用户会话信息,游标State, 私有SQL区域/Sort Area,堆栈
/共享服务器,PGA依然存在,但只有堆栈数据了,其他的几个内容都被放到UGA区域了,
UGA对server process来说是共享的,不是为那个单独服务的,而PGA是一个server process一个单独的
--UGA到底放在那里呢,如果配置了大池则放在大池里,如果没有配置大池,就会在共享池中抢一块空间出来
/使用共享服务器时,能够节省内存空间,UGA+所有PGA的大小要小于专用服务器下所有PGA的大小
24. 计算UGA使用的大小
/计算你的连接的UGA大小
SELECT SUM(value) ||'bytes' "Total session memory"
FROM v$mystat, v$statname
WHERE name = 'session uga memory'
AND v$mystat.statistic# = v$statname.statistic#;
--mystat 仅只有你自己当前会话的信息
/计算共享服务下所有用户使用的UGA大小
SELECT SUM(value) ||'bytes' "Total session memory"
FROM v$sesstat, v$statname
WHERE name = 'session uga memory'
AND v$sesstat.statistic# = v$statname.statistic#;
/计算UGA曾经用到的最大空间
SELECT SUM(value) ||'bytes' "Total max memory"
FROM v$sesstat, v$statname
WHERE name = 'session uga memory max'
AND v$sesstat.statistic# = v$statname.statistic#;
25. 大池 large pool
这一讲的最后我们来说说大池,其实我们前面已经有很多地方提到过了他,相信大家还记得。
/什么时候用大池呢
--OS不支持异步I/O,为了提高DBWn的速度,使用IO奴隶(DBWR_IO_SLAVES),不过现在的操作系统基本上都支持异步I/O,所以很少使用
--使用RMAN备份和恢复操作
--共享服务器的UGA(session memory)
--并行查询
/由参数large_pool_size参数来调整大小,也是动态参数
/在共享服务器模式下,设置大池,UGA会从Shared pool中移到大池中,这样可以把共享池的内存留给库池和数据词典用,这样可以避免
共享的SQL由于空间不够而被赶出去和额外的空间争用。
好,到这里这一讲关于共享池的调优基本上讲完了,如果还有什么问题可以提问,谢谢大家!

