Oracle 基础管理:alter system flush “oracle的缓存”


下面3条语句,旨在刷新Oracle的缓存。这里总结一下。

1)alter system flush global context

下图说明:

对于多层架构的,如上图:应用服务器和数据块服务器通过连接池进行通信,对于连接池的这些信息被保留在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可能会导致系统挂起,对于类似系统尽量在系统空闲时进行。

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

  1. SQL> select count(*) from x$ksmsp;  
  2.   
  3.   COUNT(*)  
  4. ----------   
  5.      41637  
  6.   
  7. SQL> alter system flush shared_pool;  
  8.   
  9. 系统已更改。  
  10.   
  11. SQL> select count(*) from x$ksmsp;  
  12.   
  13.   COUNT(*)  
  14. ----------   
  15.       9276  
    3)alter system flush buffer_cache

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

    测试环境

  1. SQL> select count(*) from tt;  
  2.   
  3.   COUNT(*)  
  4. ----------   
  5.    1614112  
  6.   
  7. SQL> show user;  
  8. USER 为 "HR"  
  9. SQL> exec dbms_stats.gather_table_stats('HR','TT');  
  10.   
  11. PL/SQL 过程已成功完成。  
  12.   
  13. SQL> select blocks,empty_blocks from dba_tables where table_name='TT' and owner='HR';  
  14.   
  15.     BLOCKS EMPTY_BLOCKS  
  16. ---------- ------------   
  17.      22357            0  
  18. 表TT共有22357个block  

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

  1. SQL> select count(*) from x$bh where state=0;  
  2.   
  3.   COUNT(*)  
  4. ----------   
  5.          0  
  6.   
  7. SQL> alter system flush buffer_cache;  
  8.   
  9. 系统已更改。  
  10.   
  11. SQL> select count(*) from x$bh where state=0;  
  12.   
  13.   COUNT(*)  
  14. ----------   
  15.      40440  
state=0表示buffer状态是free,flush cache后,所有的buffer都被标志为free

    观察flush cache后,对查询的影响:

  1. SQL> set autot on statistics  
  2. SQL> select count(*) from tt;  
  3.   
  4.   COUNT(*)  
  5. ----------   
  6.    1614112  
  7.   
  8.   
  9. 统计信息  
  10. ----------------------------------------------------------   
  11.           0  recursive calls  
  12.           0  db block gets  
  13.       22288  consistent gets  
  14.       22277  physical reads  
  15.           0  redo size  
  16.         416  bytes sent via SQL*Net to client  
  17.         385  bytes received via SQL*Net from client  
  18.           2  SQL*Net roundtrips to/from client  
  19.           0  sorts (memory)  
  20.           0  sorts (disk)  
  21.           1  rows processed  
  22.   
  23. SQL> /  
  24.   
  25.   COUNT(*)  
  26. ----------   
  27.    1614112  
  28.   
  29.   
  30. 统计信息  
  31. ----------------------------------------------------------   
  32.           0  recursive calls  
  33.           0  db block gets  
  34.       22288  consistent gets  
  35.           0  physical reads  
  36.           0  redo size  
  37.         416  bytes sent via SQL*Net to client  
  38.         385  bytes received via SQL*Net from client  
  39.           2  SQL*Net roundtrips to/from client  
  40.           0  sorts (memory)  
  41.           0  sorts (disk)  
  42.           1  rows processed  
  43.   
  44. SQL> alter system flush buffer_cache;  
  45.   
  46. 系统已更改。  
  47.   
  48. SQL> select count(*) from tt;  
  49.   
  50.   COUNT(*)  
  51. ----------   
  52.    1614112  
  53.   
  54.   
  55. 统计信息  
  56. ----------------------------------------------------------   
  57.           0  recursive calls  
  58.           0  db block gets  
  59.       22288  consistent gets  
  60.       22277  physical reads  
  61.           0  redo size  
  62.         416  bytes sent via SQL*Net to client  
  63.         385  bytes received via SQL*Net from client  
  64.           2  SQL*Net roundtrips to/from client  
  65.           0  sorts (memory)  
  66.           0  sorts (disk)  
  67.           1  rows processed  

相关内容