【FLUSH】將Buffer Cache內容強制寫出到資料檔案
在某些情況下需要手工將Data Buffer Cache寫出到資料檔案,例如為防止Buffer Cache中的資料對SQL執行效能的影響,為公平起見需要先對緩衝區中的資料清理。
在Oracle的不同版本里清理Buffer Cache的方法也略有不同,總體方向是向著簡單快捷方向發展的。
1.Oracle 9i方法(10g中依然可用)
1)可以使用“immediate trace name flush_cache”事件強制將Buffer Cache中的資料全部寫出到資料檔案。
sec@ora10g> alter session set events='immediate trace name flush_cache';
Session altered.
2)當執行完上述重新整理操作之後,Oracle會在alert日誌留下它的“腳印”。
Tue Dec 22 21:15:10 2009
ALTER SYSTEM: Flushing buffer cache
3)使用“alter system”語句同樣可以完成這個任務
sec@ora10g> alter system set events = 'immediate trace name flush_cache';
System altered.
4)看一下alert中的“腳印”,注意與“alter session”的區別,這裡記錄的資訊更加詳細,包含了“OS Pid”資訊。
Tue Dec 22 21:25:29 2009
ALTER SYSTEM: Flushing buffer cache
OS Pid: 17538 executed alter system set events 'immediate trace name flush_cache'
2.Oracle 10g中為簡化這個過程,提供了一個“flush buffer_cache”方法
1)具體方法
sec@ora10g> alter system flush buffer_cache;
System altered.
2)在alert中與之對應的資訊如下
Tue Dec 22 21:27:03 2009
ALTER SYSTEM: Flushing buffer cache
3.演示一下在Buffer Cache寫出前後對同一SQL的影響
1)全新SQL語句執行後的統計資訊如下
sec@ora10g> set timing on
sec@ora10g> set autot trace statistic;
sec@ora10g> select count(*) from t;
Elapsed: 00:00:00.08
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
2102 consistent gets
2093 physical reads
0 redo size
515 bytes sent via SQL*Net to client
492 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
可見“physical reads”是2093,說明Oracle將所需的資料檔案從外存讀入到了Buffer Cache。
2)同樣的SQL語句再次執行,此時Buffer Cache並未刷出到外存。
sec@ora10g> select count(*) from t;
Elapsed: 00:00:00.06
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
2102 consistent gets
0 physical reads
0 redo size
515 bytes sent via SQL*Net to client
492 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
此時“physical reads”物理讀已為零,無需重新從外存讀入資料,隨之執行時間也減少了。
3)將Buffer Cache刷出後再次嘗試同樣的SQL
sec@ora10g> alter system flush buffer_cache;
System altered.
Elapsed: 00:00:00.15
sec@ora10g> select count(*) from t;
Elapsed: 00:00:00.08
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
2102 consistent gets
2093 physical reads
0 redo size
515 bytes sent via SQL*Net to client
492 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
因為Buffer Cache中資料已經被刷出到外存,同樣的SQL的物理讀情況恢復到了第一次執行時的值2093。
4.小結
當Buffer Cache包含大量資料時,重新整理時間將會很長,沒有“特殊需求”請不要使用這個方法。
該方法在進行SQL效能測試時教為常用,為排除Buffer Cache對於測試結果影響時可以考慮使用該方法強制Oracle重新執行物理讀。
Good luck.
secooler
09.12.22
-- The End --
在Oracle的不同版本里清理Buffer Cache的方法也略有不同,總體方向是向著簡單快捷方向發展的。
1.Oracle 9i方法(10g中依然可用)
1)可以使用“immediate trace name flush_cache”事件強制將Buffer Cache中的資料全部寫出到資料檔案。
sec@ora10g> alter session set events='immediate trace name flush_cache';
Session altered.
2)當執行完上述重新整理操作之後,Oracle會在alert日誌留下它的“腳印”。
Tue Dec 22 21:15:10 2009
ALTER SYSTEM: Flushing buffer cache
3)使用“alter system”語句同樣可以完成這個任務
sec@ora10g> alter system set events = 'immediate trace name flush_cache';
System altered.
4)看一下alert中的“腳印”,注意與“alter session”的區別,這裡記錄的資訊更加詳細,包含了“OS Pid”資訊。
Tue Dec 22 21:25:29 2009
ALTER SYSTEM: Flushing buffer cache
OS Pid: 17538 executed alter system set events 'immediate trace name flush_cache'
2.Oracle 10g中為簡化這個過程,提供了一個“flush buffer_cache”方法
1)具體方法
sec@ora10g> alter system flush buffer_cache;
System altered.
2)在alert中與之對應的資訊如下
Tue Dec 22 21:27:03 2009
ALTER SYSTEM: Flushing buffer cache
3.演示一下在Buffer Cache寫出前後對同一SQL的影響
1)全新SQL語句執行後的統計資訊如下
sec@ora10g> set timing on
sec@ora10g> set autot trace statistic;
sec@ora10g> select count(*) from t;
Elapsed: 00:00:00.08
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
2102 consistent gets
2093 physical reads
0 redo size
515 bytes sent via SQL*Net to client
492 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
可見“physical reads”是2093,說明Oracle將所需的資料檔案從外存讀入到了Buffer Cache。
2)同樣的SQL語句再次執行,此時Buffer Cache並未刷出到外存。
sec@ora10g> select count(*) from t;
Elapsed: 00:00:00.06
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
2102 consistent gets
0 physical reads
0 redo size
515 bytes sent via SQL*Net to client
492 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
此時“physical reads”物理讀已為零,無需重新從外存讀入資料,隨之執行時間也減少了。
3)將Buffer Cache刷出後再次嘗試同樣的SQL
sec@ora10g> alter system flush buffer_cache;
System altered.
Elapsed: 00:00:00.15
sec@ora10g> select count(*) from t;
Elapsed: 00:00:00.08
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
2102 consistent gets
2093 physical reads
0 redo size
515 bytes sent via SQL*Net to client
492 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
因為Buffer Cache中資料已經被刷出到外存,同樣的SQL的物理讀情況恢復到了第一次執行時的值2093。
4.小結
當Buffer Cache包含大量資料時,重新整理時間將會很長,沒有“特殊需求”請不要使用這個方法。
該方法在進行SQL效能測試時教為常用,為排除Buffer Cache對於測試結果影響時可以考慮使用該方法強制Oracle重新執行物理讀。
Good luck.
secooler
09.12.22
-- The End --
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/519536/viewspace-623381/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 將Buffer Cache內容強制寫出到資料檔案
- 將dataGridView內容匯出到Excel檔案ViewExcel
- git將指定內容寫入檔案Git
- 如何將資料熱匯出到檔案
- Oracle中flush buffer cache和x$bhOracle
- buffer cache 內部機制深入探索【一】
- oracle buffer cache管理機制_buffer cache dump與lru機制小記Oracle
- 有關web頁面內容檔案強制下載程式碼Web
- HybridDBforPG中如何按照資料內容定製輸出到OSS檔名和檔案個數
- java檔案相關(檔案追加內容、檔案內容清空、檔案內容讀取)Java
- python操作檔案寫入內容Python
- 如何檢視buffer cache的髒資料是否寫回磁碟
- 【Cache】將常用的“小表”快取到Buffer Cache快取
- Buffer Cache Size(資料緩衝區)
- 將資料匯出到ExcelExcel
- (OAF)jdeveloper整合log4j並將日誌輸出到指定檔案並寫入資料庫Developer資料庫
- 將excel檔案內容儲存到資料庫,並可以實時在前端檢視(不必生成檔案)Excel資料庫前端
- Docker將映象檔案釋出到私服庫Docker
- 清空listener.log檔案內容後,內容不能寫入listener.log檔案的解決方法
- pytesseract實現識別pdf檔案並將內容寫入word文件中
- 用python寫一個指令碼,讀取srt檔案中的內容,並列印出重複的內容,且將不重複的內容儲存到新檔案中Python指令碼
- Docker將映象檔案釋出到阿里雲Docker阿里
- MySQL 將查詢結果匯出到檔案MySql
- 利用echo把內容寫入相關solaris 檔案
- 【Linux】檢視二進位制檔案內容_hexdumpLinux
- 將檔案轉移到一個資料夾內batBAT
- 強制刪除歸檔檔案
- 檔案內容拷貝
- Oracle 控制檔案內容Oracle
- 檔案內容比較
- vim內替換檔案內容
- oracle buffer cache管理機制之lruw_dbwrOracle
- Python批量修改資料夾內所有json檔案中部分內容PythonJSON
- 定時將表資料匯出到文字檔案的初步解決方案,求改進
- python如何將資料寫入本地txt文字檔案Python
- python——將excel檔案寫入mysql資料庫中PythonExcelMySql資料庫
- 使用events DUMP buffer cache中指定的資料塊
- Buffer Cache 原理