下面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可能會導致系統掛起,對於類似系統盡量在系統空閑時進行。
下面測試一下,重新整理對共用池片段的影響:
SQL> select count(*) from x$ksmsp; COUNT(*)---------- 41637SQL> 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(*)---------- 1614112SQL> 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(*)---------- 0SQL> 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 statisticsSQL> 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 processedSQL> / 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 processedSQL> 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