Oracle学习之sql共享以及4031解决方法
》共享sql:
1、统一书写风格
2、使用绑定变量
》》找出没有共享的SQL语句:
在v$sql查找执行次数较小的SQL语句,观察这些SQL语句是否是经常执行的。
select SQL_FULLTEXT from v$sql where EXECUTIONS=1 and sql_text like ‘%from t%‘;
select SQL_FULLTEXT from v$sql where EXECUTIONS=1 order by sql_text; --将执行次数只有一次的语句列出,同时排序
》解析命中率:
select sum(pinhits)/sum(pins)*100 from v$librarycache; --软解析
select sum(gets),sum(getmisses),100*sum(gets-getmisses)/sum(gets) from v$rowcache where gets>0;
》解决4031错误方法
1、alter system flush shared_pool; --临时手段
2、共享sql
alter system set cursor_sharing=‘force‘;
3、select * from v$db_object_cache where sharable_mem > 10000
and (type = ‘PACKAGE‘ or type=‘PACKAGE BODY‘ or type=‘FUNCTION‘ or type=‘PROCEDURE‘)
and kept = ‘NO‘;
执行dbms_shared_pool.keep(‘上一条语句出来的对象名‘);
DBMS_SHARED_POOL
@?/rdbms/admin/dbmspool.sql
4、保留区
select REQUEST_MISSES from v$shared_pool_reserved;
show parameter shared;
5、增加shared pool空间
select COMPONENT,CURRENT_SIZE from V$SGA_DYNAMIC_COMPONENTS;
show parameter sga_target
show parameter sga_max_size
alter system set shared_pool_size=150M scope=both;--Oracle 默认会有159M,只能修改比159M大
Oracle学习之sql共享以及4031解决方法
标签:
小编还为您整理了以下内容,可能对您也有帮助:
oracle数据库的ORA-04031错误到底是怎么回事, 请简单解释一下!初学者能听懂的那种04
1. SGA中的内存池包含不同大小的内存块。当数据库启动时,就有一个大的内存块分配并被hush buckets 里的空闲列表追踪。随着时间推移,随着内存的分配和释放,内存块被按照大小在不同的hush buckets间移动。当SGA里任何一个内存池里出现不能满足内部分配请求的情况时,ORA-04031就出现了。
shared pool共享池的管理方式不同于其它的内存池。。共享池存放与数据字典和library cache有关的信息。但是,这些内存区域根据空闲列表和最近使用算法(LRU)管理。当在共享池的所有搜索结束后,从LRU列表清除所有的可能清除的对象, 多次扫描空闲列表后,仍没有找到内存块,ORA-04031就出现了。这意味着ORA-04031很难预测。
2. 对共享池的监测,可以看它是否包含许多类似的SQL,只有文字不同。 这种情况会占用更多的共享池内存并引共享池碎片,过多的共享池碎片(fragment)会导致虽然共享池中仍有大量的free memory,但都是尺寸较小的内存块(chunk),当Oracle进程申请一些较大的连续内存空间(memory chunk)时,虽然共享池中的free memory大小远大于申请的连续空间大小,仍会引发ORA-4031错误。使用绑定变量可以使SQL 共享。使用本文所附的脚本可以查出内存中是否有许多类似SQL。
即使使用了绑定变量后,仍然可能存在高version count(子指针)的情况。为了使子指针共享,CURSOR_SHARING参数可能需要调整。metalink 文档Note 296377.1 和 261020.1可以提供详细信息。若造成4031的原因是由于未绑定变量或者游标无法共享导致的过度硬解析(Hard Parse),则应当调整应用绑定变量或者调整初始化参数。
3. 9i中开始引入shared pool subpool子池技术。设计多个共享池子池的目的是分散单个shared pool LRU Latch的并行压力。 ,每一个子池都包含自有的LRU LIST和保留区域等其他内存结构。 subpools子池的数量会在Oracle实例启动(startup nomount)时根据SGA_MAX_SIZE(或11g中的memory_max_target)以及服务器上的CPU数量而自动决定。子池数量最多为7个,在Card系统中为4个。
每一个subpool都是一个”迷你型”的共享池,其包括自有的Freelist、内存结构记录和LRU LIST。subpool子池技术是对shared pool并发扩张能力的增强,且每一个子池现在都使用的shared pool child latch来保护。这意味着不再像9i以前的版本那样因为只有一个shared pool latch而剧烈争用了。
但是在实际使用中发现版本9i中仍存在一些BUG,可能导致在子池之间的内存使用分布不平衡均匀,这可能导致虽然部分子池使用率不高,但是个别子池内存过度分配,从而导致ORA-4031错误。一般把这种现象称作”subpool imbalance”。
oracle 中报ora-30926 无法在源表中获得稳定的行 是怎么回事
代码输入错误造成的,操作方法如下:
1、首先在电脑中打开oracle之后,如下图所示,查看表中重复的数据。
2、然后使用distinct去除函数查询出去掉重复后的数据,如下图所示。
3、接着创建新表把去掉重复的数据插入到新表中,如下图所示。
4、然后使用truncate清空原表中的数据,如下图所示。
5、最后再向原表中插入新表中重复的数据,即可达到去重复数据的效果。
有关ORACLE登陆出错问题:ora-01033:oracle initialization or shutdown in progress 解决方法,求解。
1、mount数据库
sql> startup mount
2 alter system set db_recovery_file_dest_size=2g scope=spfile;
{或者 ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE=4G SCOPE=BOTH;}
参数db_recovery_file_dest_size的值根据磁盘剩余空间大小和实际需要来设置,
3、打开数据库
sql> alter database open
4、删除失效归档日志.
rman
RMAN> connect target /
RMAN> crosscheck archivelog all;
RMAN> delete expired archivelog all;
RMAN> exit
5、重新启动数据库
sql> shutdown immediate
sql> startup
参考 http://blog.csdn.net/jianyi7659/article/details/5908204
tomcat 问题
根据你上面的信息 可以看出你用的是Oracle + JAVA + Hibernate等技术
产生这个问题的原因很可能是:
编译Java代码的时候内存溢出,在共享池中试图分配大片的连续内存失败,没有足够大单个的大块内存满足请求,产生了ORA-04031 错误
解决问题的办法:
关闭数据库然后把参数 JAVA_POOL_SIZE 设定为一个较大的值。错误信息中提到的 "shared pool" 其实是共享全局区(SGA)溢出的误导,你应该加大JAVA_POOL_SIZE 参数的值,然后重启动系统,再试一下。
从你补充的问题看 应该是在服务器上设置的数据库自动备份吧
也不知道你其他详细的配置环境和具体的应用,从上面我看出的就这些,希望能够帮助你。
tomcat 问题
根据你上面的信息 可以看出你用的是Oracle + JAVA + Hibernate等技术
产生这个问题的原因很可能是:
编译Java代码的时候内存溢出,在共享池中试图分配大片的连续内存失败,没有足够大单个的大块内存满足请求,产生了ORA-04031 错误
解决问题的办法:
关闭数据库然后把参数 JAVA_POOL_SIZE 设定为一个较大的值。错误信息中提到的 "shared pool" 其实是共享全局区(SGA)溢出的误导,你应该加大JAVA_POOL_SIZE 参数的值,然后重启动系统,再试一下。
从你补充的问题看 应该是在服务器上设置的数据库自动备份吧
也不知道你其他详细的配置环境和具体的应用,从上面我看出的就这些,希望能够帮助你。
如何解决ORACLE共享内存不足的方法
�峙涓�蚕沓氐哪诖娌蛔阋灾�阌没�肭螅�蛘叽嬖诒厝凰槠��挥杏杏玫牟僮鞅A羟��斐晌薹ǚ峙浜鲜实墓蚕砬�� 一个ORACLE例程的系统全局区域(SGA)包含几个内存区域(搜罗缓冲高速缓存、共享池、Java 池、年夜型池和重做日志缓冲) SGA=db_cache+shared_pool+java_pool+large_pool 措置体例: 手动调整SGA的巨细,然后年夜头分配四年夜内存区域的巨细。首要增添共享内存缓和冲高速缓存。 sql>show parameter sga_max_size //查看SGA最年夜值 sql> show parameter shared_pool //查看共享内存 sql>show parameter db_cache //查看数据缓存 sql> alter system set sga_max_size = 500M scope=spfile;//改削SGA最年夜值 sql> alter system set shared_pool_size =200M scope=spfile; //改削共享内存 sql> alter system set db_cache_size =250M scope=spfile; //改削数据缓存