ITPub博客

首页 > 数据库 > Oracle > 刷新缓冲区的信息

刷新缓冲区的信息

Oracle 作者:xypincle 时间:2017-04-09 15:13:42 0 删除 编辑

  1. SQL> alter system flush buffer_cache ;

  2. SQL> alter system flush shared_pool ;

  3. SQL> alter system flush global context ;

  1. 下面3条语句,旨在刷新Oracle的缓存。这里总结一下。
  2. 1)alter system flush global context
  3. 下图说明:

  4. 对于多层架构的,如上图:应用服务器和数据块服务器通过连接池进行通信,对于连接池的这些信息被保留在SGA中,这条语句便是把这些连接信息清空。
  5. 2)alter system flush shared_pool
  6. 将使library cache和data dictionary cache以前保存的sql执行计划全部清空,但不会清空共享sql区或者共享pl/sql区里面缓存的最近被执行的条目。刷新共享池可以帮助合并碎片(small chunks),释放少数共享池资源,暂时解决shared_pool中的碎片问题。但是,这种做法通常是不被推荐的。原因如下:
  7. ·Flush Shared Pool会导致当前未使用的cursor被清除出共享池,如果这些SQL随后需要执行,那么数据库将经历大量的硬解析,系统将会经历严重的CPU争用,数据库将会产生激烈的Latch竞争。
  8. ·如果应用没有使用绑定变量,大量类似SQL不停执行,那么Flush Shared Pool可能只能带来短暂的改善,数据库很快就会回到原来的状态。
  9. ·如果Shared Pool很大,并且系统非常繁忙,刷新Shared Pool可能会导致系统挂起,对于类似系统尽量在系统空闲时进行。
  10. 下面测试一下,刷新对共享池碎片的影响:
  11. SQL> select count(*) from x$ksmsp;  
  12.   
  13.   COUNT(*)  
  14. ----------   
  15.      41637  
  16.   
  17. SQL> alter system flush shared_pool;  
  18.   
  19. 系统已更改。  
  20.   
  21. SQL> select count(*) from x$ksmsp;  
  22.   
  23.   COUNT(*)  
  24. ----------   
  25.       9276  
  26. 3)alter system flush buffer_cache
  27. 为了最小化cache对测试实验的影响,需要手动刷新buffer cache,以促使oracle重新执行物理访问(统计信息里面的:physical reads)。
  28. 测试环境
  29. SQL> select count(*) from tt;  
  30.   
  31.   COUNT(*)  
  32. ----------   
  33.    1614112  
  34.   
  35. SQL> show user;  
  36. USER 为 "HR"  
  37. SQL> exec dbms_stats.gather_table_stats('HR','TT');  
  38.   
  39. PL/SQL 过程已成功完成。  
  40.   
  41. SQL> select blocks,empty_blocks from dba_tables where table_name='TT' and owner='HR';  
  42.   
  43.     BLOCKS EMPTY_BLOCKS  
  44. ---------- ------------   
  45.      22357            0  
  46. 表TT共有22357个block  
  47.     借助x$bh,观察state=0的情况
  48. SQL> select count(*) from x$bh where state=0;  
  49.   
  50.   COUNT(*)  
  51. ----------   
  52.          0  
  53.   
  54. SQL> alter system flush buffer_cache;  
  55.   
  56. 系统已更改。  
  57.   
  58. SQL> select count(*) from x$bh where state=0;  
  59.   
  60.   COUNT(*)  
  61. ----------   
  62.      40440  
  63. state=0表示buffer状态是free,flush cache后,所有的buffer都被标志为free
  64.     观察flush cache后,对查询的影响:
  65. SQL> set autot on statistics  
  66. SQL> select count(*) from tt;  
  67.   
  68.   COUNT(*)  
  69. ----------   
  70.    1614112  
  71.   
  72.   
  73. 统计信息  
  74. ----------------------------------------------------------   
  75.           0  recursive calls  
  76.           0  db block gets  
  77.       22288  consistent gets  
  78.       22277  physical reads  
  79.           0  redo size  
  80.         416  bytes sent via SQL*Net to client  
  81.         385  bytes received via SQL*Net from client  
  82.           2  SQL*Net roundtrips to/from client  
  83.           0  sorts (memory)  
  84.           0  sorts (disk)  
  85.           1  rows processed  
  86.   
  87. SQL> /  
  88.   
  89.   COUNT(*)  
  90. ----------   
  91.    1614112  
  92.   
  93.   
  94. 统计信息  
  95. ----------------------------------------------------------   
  96.           0  recursive calls  
  97.           0  db block gets  
  98.       22288  consistent gets  
  99.           0  physical reads  
  100.           0  redo size  
  101.         416  bytes sent via SQL*Net to client  
  102.         385  bytes received via SQL*Net from client  
  103.           2  SQL*Net roundtrips to/from client  
  104.           0  sorts (memory)  
  105.           0  sorts (disk)  
  106.           1  rows processed  
  107.   
  108. SQL> alter system flush buffer_cache;  
  109.   
  110. 系统已更改。  
  111.   
  112. SQL> select count(*) from tt;  
  113.   
  114.   COUNT(*)  
  115. ----------   
  116.    1614112  
  117.   
  118.   
  119. 统计信息  
  120. ----------------------------------------------------------   
  121.           0  recursive calls  
  122.           0  db block gets  
  123.       22288  consistent gets  
  124.       22277  physical reads  
  125.           0  redo size  
  126.         416  bytes sent via SQL*Net to client  
  127.         385  bytes received via SQL*Net from client  
  128.           2  SQL*Net roundtrips to/from client  
  129.           0  sorts (memory)  
  130.           0  sorts (disk)  
  131.           1  rows processed  


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/28878983/viewspace-2136866/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2013-05-11

  • 博文量
    208
  • 访问量
    212347