Oracle11g新特性:SQL Result Cache [zt]

xsb發表於2011-01-17

DB_BUFFER只能快取訪問過的BLOCK,部分解決了物理讀的問題,查詢仍然需要大量的邏輯讀。

物化檢視提供的是查詢重寫的功能,對於大部分的情況,只是簡化了SQL的複雜度,即使是完全滿足查詢的條件,物化檢視的掃描也是不可避免的。

而快取結果集——RESULT CACHE則截然不同,它快取的是查詢的結果。不再需要大量的邏輯讀,不再需要任何的複雜計算,而是直接將已經快取的結果返回。

[@more@]

Server Result Cache透過在SGA中分配一個緩衝區來儲存查詢結果,Oracle引入了幾個新的初始化引數來控制這個cache的大小:RESULT_CACHE_MODERESULT_CACHE_MAX_SIZE等。RESULT_CACHE_MAX_SIZE指明SGARESULT CACHE功能可以使用的最大的記憶體容量。如果這個引數設定為0,則關閉RESULT CACHE功能。引數result_cache_max_result則控制單個快取結果可以佔總的Server result cache大小的百分比。RESULT_CACHE_MODE引數設定Oracle如何使用RESULT CACHE,該引數有三個值:MANUALAUTOFORCE。可以在system、session、table或者語句級別來設定cache的使用。在語句級可以使用一個新的hint來控制是否快取查詢結果。Oracle新增了兩個HINTRESULT_CACHENO_RESULT_CACHE。透過這兩個提示,可以明確的指出下面的語句是否進行RESULT CACHE

Oracle提供了DBMS_RESULT_CACHE包來管理和維護RESULT CACHEOracle還新增了幾個關於RESULT CACHE的系統檢視,使用者可以看到和RESULT CACHE相關的各種資訊,檢視包括:V$RESULT_CACHE_DEPENDENCYV$RESULT_CACHE_MEMORYV$RESULT_CACHE_OBJECTSV$RESULT_CACHE_STATISTICS等。

除了Server端引入Result Cache,透過OCI介面,在Client端也可以快取查詢結果。典型的場景就是我們在應用伺服器端快取查詢結果,這樣在前端執行該查詢時,甚至不需要到資料庫中去執行該查詢。客戶端結果快取在OCI程式中,可以被該程式中的多個session或者執行緒共享。客戶端快取機制透過一個新的初始化引數來控制:client_result_cache_size,當該引數大於0時,該特性被啟用。同樣的,該特性也可以在system、session、table或者語句級來設定。透過在服務端設定引數而不是客戶端設定,可以集中的管理該特性,但是也可以在各個客戶端單獨進行設定,客戶端的設定將覆蓋服務端的設定。

下面簡單說明一下RESULT_CACHE_MODE的三種模式下,快取結果集是如何工作的。

  • 當引數值設定為MANUAL時,只有透過HINT明確提示的SQL才會讀取快取結果集。如果不加提示,那麼Oracle不會利用已經快取的結果。
  • 而對於AUTO模式,Oracle如果發現緩衝結果集已經存在,那麼就會使用。但是如果緩衝結果集不存在,Oracle並不會自動進行緩衝。只有使用HINT的情況下,Oracle才會將執行的結果集快取。
  • 對於FORCE引數,顧名思義,就是會對所有的SQL進行快取,除非明確使用NO_RESULT_CACHE提示。

RESULT CACHE功能對於下列情況是無效的:系統表和臨時表;序列的NEXTVALCURRVAL偽列;SYSDATESYSTIMESTAMP等函式;所有非確定性PL/SQL函式。

REF:
Oracle11新特性——SQL快取結果集(一)
Oracle11新特性——SQL快取結果集(二) Oracle11新特性——SQL快取結果集(三) Oracle11新特性——SQL快取結果集(四) Oracle11新特性——SQL快取結果集(五)

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12402/viewspace-1044773/,如需轉載,請註明出處,否則將追究法律責任。

相關文章