您的位置:首页 > 其它

ORA-4031

2016-09-18 15:14 274 查看
错误的原因,一般是大量的Hard Parse 导致了shared pool中的free list中产生大量的内存小碎片,当一个需要很大内存来进行hard parse的sql语句到来时,无法从free list中找到内存,即使进行内存的释放,还是不能找到符合的内存块。从而报ORA-4031错误。

ORA-4031错误的解决方法:

1)alter system flush shared_pool;将shared pool中的所有内存清空。该方法治标不治本。

2)共享SQL语句:规范SQL语句的书写;使用绑定变量;找到没有使用绑定变量的SQL:

   如果在结果中发现一系列仅仅字面值不同的SQL,则可以修改cursor_sharing参数:

   alter system set cursor_sharing = 'force'; 来强制使用绑定变量。

3)使用shared pool中的保留区:

   select request_misses from v$shared_pool_reserved;

   如果结果大于0,则可以调大shared_pool_reserved的大小;

   SQL> show parameter shared_pool

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

shared_pool_reserved_size            big integer 4M

shared_pool_size                     big integer 0

alter system set shared_pool_reserved=xxM scope=both;

4)使用dbms_shared_pool.keep('对象名')将使用内存很大的对象keep在内存中

SQL> @?/rdbms/admin/dbmspool.sql

SQL>select * from v$db_object_cache where sharable_mem>1000 and (type='PACKAGE' or type='PACKAGE BODY' or type='FUNCTION' or type='PROCEDURE') and kept='NO';

5)增加shared_pool_size的大小:

alter system set shared_pool_size=xxM scope=both;

可以使用下面的SQL语句来预估shared pool的大小:

select 'Shared Pool' component,shared_pool_size_for_estimate estd_sp_size,estd_lc_time_saved_factor parse_time_factor,case when current_parse_time_elapsed_s + adjustment_s<0

then 0 else current_parse_time_elapsed_s + adjustment_s end response_time

from (
select shared_pool_size_for_estimate,shared_pool_size_factor,estd_lc_time_saved_factor,a.estd_lc_time_saved,e.value/100
current_parse_time_elapsed_s,c.estd_lc_time_saved - a.estd_lc_time_saved adjustment_s from v$shared_pool_advice a,
(select * from v$sysstat where name='parse time elapsed') e,
(select estd_lc_time_saved from v$shared_pool_advice where shared_pool_size_factor=1) c

);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: