_row_cache_cursors参数当前已经被设置为隐含参数,通常讲这个参数设置为较大的非默认值(默认10)不能得到很大的性能提高。但是如果将其设置的过大只会浪费内存,因为很少情况下会使用达到几兆,科学的方法是恰当的设置提高该值。
此参数的作用
根据文档或者X$KSPPI中的描述,该参数用来限制字典缓存管理可以缓存在共享池中的共享游标数量。但是通常在V$SQLAREA上一个简单的查询可以显示事实上并没有这个限制行缓存游标在共享池中并没有特别的处理。
事实上,该参数限制一个进程在调用期间行缓存游标的私有SQL区域的数量。并且这个私有SQL区的缓存,或者共享游标实例化,是由PGA而不是UGA控制的。_row_cache_cursors参数设置持久PGA内存中的数组数量,数组中的每个槽需要28个字节。该值过小会导致不必要的软解析,过大的值则会浪费每个Oracle服务器进程中pga的内存。并且可能会减少其他游标的缓存。
调整方法
Oracle在X$KQDPG中为行缓存游标的私有sql区缓存保持了一些统计。该表报告了缓存限制,需要行缓存游标的次数,需要实例化的次数,以及缓存溢出的次数。如果缓存太小就会发生溢出,否则就是足够大。通常需要的并发缓存行游标数依赖于调用的延迟时间和复杂性,对于长运行的引用大量dd对象的pl/sql过程,最可能获益于增加行缓存游标实例化。
但是X$KQDPG的缺点是其是进程依赖的,并且不能查询其他进程,因此需要统计那些有代表性的应用程序进程,而不是用来监控性能的进程的统计。
不过另一种方法是:X$KQDPG后面的数据结构是fixed PGA,可以很容易的使用level 1 global_area得到有代表性的进程dump其fixed PGA到跟踪文件(使用ORADEBUG或DBMS_SYSTEM.SET_EV调用) 。然后在那里查找kqdpga_数据结构,跳过12个字节,然后读取16进制返回值。
假如发现溢出,你可以选择增加 _row_cache_cursors的值,在这些值上的很小的增加通常能够有效的防止溢出并且不会产生过多的影响。