Library cache 包含 shared SQL and PL/SQL areas(PL/SQL 包括 Procedures,
Functions, Packages, Trigger, 匿名 PL/SQL 块)
Sizing the Library Cache
定义 stored object(packages,views 等等 ) 的内存需求; 定义经常使用的 sql statement
的所需内存
1. 初始时将 SHARED_POOL_SIZE设得很大 , 运行应用程序
2. 计算 stored object 所占的内存
SELECT SUM(sharable_mem) FROM v$db_object_cache WHERE type =
'PACKAGE' or type = 'PACKAGE BODY' or type = 'FUNCTION' or type = 'PROCEDURE';
3. 应用程序运行一段时间后 , 估计常用 sql 语句所占的内存 ( 不包括动态 SQL)
SELECT SUM(sharable_mem) FROM v$sqlarea WHERE executions > 5;
4. 对每个 user 每个打开的 cursor, 需要 250bytes, 可在运行高峰期间使用查询 :
SELECT SUM(250 * users_opening) FROM v$sqlarea;
5. 在测试环境中 , 可让一个用户打开一定数量的 cursor, 运行下列语句测试共享内存 ,
然后乘上 user 数
SELECT 250 * value bytes_per_user FROM v$sesstat s, v$statname
n WHERE s.statistic# = n.statistic# AND n.name = 'opened cursors current' AND
s.sid = 15;
以上内存的和 , 再加上一点内存 ( 留给动态 SQL使用 ), 作为你的应用的理想内存设置;预
留一部分空间作为大的内存需要 , 避免 miss 和碎片;一些大的内存需要 : PL/SQL 块的编
译,trigger 的编译;小的 object 不会使预留空间碎片化 , 反而保证 reserved list 有大的连
续块 , 一旦从 reserved list 中分配的内存释放它就返回 reserved list 。
影响的参数: SHARED_POOL_RESERVED_SIZE 初始值 =SHARED_POOL_SIZE*10%, 超过
50%,oracle server 报错
OPEN_CURSORS 缺省 =50
定义了涉及分配给用户进程的私有 SQL区域的 cursors 数量 , 一个 private SQL area
一直存在直至 cursor 关闭 ; 为了利用更多的内存给共享 SQL区域 , 需要提高 session 每个
session 允许多 cursor 数量 , 开发人员应关闭不需要的 cursor 节省内存
CURSOR_SPACE_FOR_TIME缺省 =FALSE 布尔值
设置 TRUE,表示以空间换取时间 , 共享 SQL区不会被 aged out 直至相关的 cursor 被关闭 ,
因此确信有足够的内存 , 没有 cache miss; 除非 RELOADS in V$LIBRARYCACHE一直为 0, 否则不
要改变此参数值
若应用为 FORM或使用动态 SQL,设此值为 FALSE -- 因为动态 sql 总是不一致 , 将占用过
多内存
SESSION_CACHED_CURSORS缺省 =0 表示没有 cache
当一个 session 打算关闭一个 cursor 时, 如果这个 cursor 的 parse count 超过 3 次, 那
么这个 cursor 将会被加到 session cursor cache list 的 MRU端. 当一个 session 打算 parse
一个 sql 时, 它会先去 session 的 pga 内搜索 session cursor cache list, 如果找到那么会
把这个 cursor 脱离 list, 然后当关闭的时候再把这个 cursor 加到 MRU端.
session_cached_cursor 提供了快速软分析的功能 , 提供了比 soft parse 更高的性能 .
检查系统是否需要此参数的方法 :
对某个典型用户 session
select a.sid,b.name,a.value from v$sesstat a,v$statname b where
评论0
最新资源