设为首页 收藏本站
查看: 458|回复: 0

[经验分享] alter system flush "oracle的缓存"

[复制链接]

尚未签到

发表于 2016-7-27 08:12:03 | 显示全部楼层 |阅读模式
   下面3条语句,旨在刷新oracle的缓存。这里总结一下。
  
   1)alter system flush global context
   下图说明:
DSC0000.png
   对于多层架构的,如上图:应用服务器和数据块服务器通过连接池进行通信,对于连接池的这些信息被保留在SGA中,这条语句便是把这些连接信息清空。
  
   2)alter system flush shared_pool
   将使library cache和data dictionary cache以前保存的sql执行计划全部清空,但不会清空共享sql区或者共享pl/sql区里面缓存的最近被执行的条目。刷新共享池可以帮助合并碎片(small chunks),释放少数共享池资源,暂时解决shared_pool中的碎片问题。但是,这种做法通常是不被推荐的。原因如下:
   ·Flush Shared Pool会导致当前未使用的cursor被清除出共享池,如果这些SQL随后需要执行,那么数据库将经历大量的硬解析,系统将会经历严重的CPU争用,数据库将会产生激烈的Latch竞争。

·如果应用没有使用绑定变量,大量类似SQL不停执行,那么Flush Shared Pool可能只能带来短暂的改善,数据库很快就会回到原来的状态。

·如果Shared Pool很大,并且系统非常繁忙,刷新Shared Pool可能会导致系统挂起,对于类似系统尽量在系统空闲时进行。

   下面测试一下,刷新对共享池碎片的影响:

SQL> select count(*) from x$ksmsp;
COUNT(*)
----------
41637
SQL> alter system flush shared_pool;
系统已更改。
SQL> select count(*) from x$ksmsp;
COUNT(*)
----------
9276
  

3)alter system flush buffer_cache
   为了最小化cache对测试实验的影响,需要手动刷新buffer cache,以促使oracle重新执行物理访问(统计信息里面的:physical reads)。
   测试环境

SQL> select count(*) from tt;
COUNT(*)
----------
1614112
SQL> show user;
USER 为 "HR"
SQL> exec dbms_stats.gather_table_stats('HR','TT');
PL/SQL 过程已成功完成。
SQL> select blocks,empty_blocks from dba_tables where table_name='TT' and owner='HR';
BLOCKS EMPTY_BLOCKS
---------- ------------
22357            0
表TT共有22357个block
  

借助x$bh,观察state=0的情况

SQL> select count(*) from x$bh where state=0;
COUNT(*)
----------
0
SQL> alter system flush buffer_cache;
系统已更改。
SQL> select count(*) from x$bh where state=0;
COUNT(*)
----------
40440
  

state=0表示buffer状态是free,flush cache后,所有的buffer都被标志为free
  观察flush cache后,对查询的影响:

SQL> set autot on statistics
SQL> select count(*) from tt;
COUNT(*)
----------
1614112

统计信息
----------------------------------------------------------
0  recursive calls
0  db block gets
22288  consistent gets
22277  physical reads
0  redo size
416  bytes sent via SQL*Net to client
385  bytes received via SQL*Net from client
2  SQL*Net roundtrips to/from client
0  sorts (memory)
0  sorts (disk)
1  rows processed
SQL> /
COUNT(*)
----------
1614112

统计信息
----------------------------------------------------------
0  recursive calls
0  db block gets
22288  consistent gets
0  physical reads
0  redo size
416  bytes sent via SQL*Net to client
385  bytes received via SQL*Net from client
2  SQL*Net roundtrips to/from client
0  sorts (memory)
0  sorts (disk)
1  rows processed
SQL> alter system flush buffer_cache;
系统已更改。
SQL> select count(*) from tt;
COUNT(*)
----------
1614112

统计信息
----------------------------------------------------------
0  recursive calls
0  db block gets
22288  consistent gets
22277  physical reads
0  redo size
416  bytes sent via SQL*Net to client
385  bytes received via SQL*Net from client
2  SQL*Net roundtrips to/from client
0  sorts (memory)
0  sorts (disk)
1  rows processed

  

  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-249919-1-1.html 上篇帖子: Oracle数据库表之段 下篇帖子: 探索ORACLE之RMAN_06备份策略
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表