微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

小记:不明原因的解决了ORACLE慢的问题

小记:不明原因的解决了ORACLE慢的问题

OracleSQLLinux应用服务器Cache  小记:不明原因的解决了ORACLE慢的问题

    近来发现ORACLE服务器超级慢,而且慢并不是由应用程序性能导致的,就连运行proc预编译程序都很慢,可见问题还是出在ORACLE服务器

本身。
   首先查看了一下ORACLE的主要内存参数:

SELECT "NUM","NAME","TYPE","VALUE"/1024 AS "KB",

"ISDEFAULT","ISSES_MODIFIABLE","ISSYS_MODIFIABLE",

"ISMODIFIED","ISADJUSTED","DESCRIPTION","UPDATE_COMMENT"

FROM v$parameter

WHERE NAME IN ('db_block_size', 'db_cache_size',

    'java_pool_size', 'large_pool_size', 'pga_aggregate_target',

    'shared_pool_size', 'sort_area_size')

   除了大池(large_pool_size)为16MB以外,每项内存都配置得不小。
   于是怀疑是共享池满造成的,在网上找了篇文章查了查共享池的占用情况:
       《如何计算oracle共享池的大小》 http://blog.sina.com.cn/s/blog_3ebdf8ad010006bk.html
   执行了一下,共享池竟然占用了113%。居然溢出了!!!搞不懂!

   于是尝试着修改参数:
1.在linux下:su - oracle
2. sqlplus "/as sysdba"
3. CREATE PFILE='ahfu.ora' FROM SPFILE;
4. 在LINUX下:cd /oracle/ora9/product/9.2/dbs/
5. vi ahfu.ora
6. 修改参数如下:
   db_cache_size (数据缓存)  256MB  ->  512MB
   java_pool_size (java池)  84MB   ->  0MB
   large_pool_size (大池)    16MB   ->  64MB
   query_rewrite_enabled (查询重写) FALSE  ->  TRUE
7. 保存,关闭@R_404_6274@:shutdown immediate;
8. 从新的pfile启动:startup pfile='/oracle/ora9/product/9.2/dbs/ahfu.ora';
9. 重新连接@R_404_6274@,发现连接和查询都变得很快了。反复重启@R_404_6274@多次,仍然很快。

   猜测一方面是因为共享池满导致了@R_404_6274@慢,另一方面是大池设置得过小。但是重启后变快并不能说明真正解决了问题,要多运行一段时间

才知道。

====================================================
附1:对共享池的分析
    共享池缓存了系统中执行过的sql。如果出现大量的不同的sql,就可能导致共享池满。共享池满后,每次执行sql都会扫描共享池,寻找相

同的sql,找不到后又扫描整个共享池将长时间为执行的sql设置为过期,为新的sql分配空间。因此,哪怕是很简单的sql,每次执行都会反复

扫描共享池,使得整个系统都很慢。共享池满的问题并不是立即发生的,需要一定的积累过程。所以@R_404_6274@刚刚启动的时候,共享池是空的,

执行总是很快。@R_404_6274@运行一段时间后,共享池满了,才会发现@R_404_6274@很慢。大量不同的sql会导致共享池问题:
    比如:select user_name from webuser.user_info where user_id=:UserID;
       与select user_name from webuser.user_info where user_id=1
   上面两条sql语句,第一条使用参数绑定,在共享池中会多次被命中,性能很高;而第二条,参数采用常量,很难被命中,每次都要重新解

析,并且会占用共享池的空间。

附2:对查询重写的分析
    查询重写功能是指@R_404_6274@引擎强制将所有sql中的参数修改成参数绑定的格式。
       例如,@R_404_6274@强制将select user_name from webuser.user_info where user_id=1这条sql
             强制修改成select user_name from webuser.user_info where user_id=:UserID
   查询重写能够有效避免共享池满的问题,但是会增加sql的解析时间。
 

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐