Result Cache nedir ve nasıl kullanılır ?
Result Cache , Shared Global Area (SGA) içindeki shared pool alanındaki , bellek alanıdır. Bu alanda tekrar kullanım için veritabanı sorgu sonucu veya sorgu bloğu tutulur. Cache’lenmiş bloklar , sql cümleleri ve stale durumda olmayan oturumlar tarafından paylaşılır.
Result Cache kullanımı küçük ve sık erişim gerektiren tablolar için idealdir. Büyük tablolar için kullanılması sıkıntı yaratabilir. Fakat sürekli sorgulanan kullanıcı bilgileri, parametre gibi tablolarda çok ciddi kazanım sağlayacaktır.
Result Cache , Oracle Database 11g Release 1 versiyonuyla gelmiş olup , varsayılan olarak enable durumdadır.
Result Cache durumunu aşağıdaki sorgu ile öğrenebiliriz .
SQL> SELECT dbms_result_cache.status() FROM dual; DBMS_RESULT_CACHE.STATUS() -------------------------------------------------------------------------------- ENABLED
Result cache ile ilgili iki önemli parametrenin set edilmesinde fayda var. result_cache_max_size ve shared_pool_size için aşağıdaki gibi bir değer atamanız , sistemi dar boğaza sokmamak için gereklidir. Belleğinize göre yada ihtiyacınıza göre bu parametreleri ayarlayabilirsiniz.
SQL> ALTER SYSTEM SET result_cache_max_size = 2G SCOPE = SPFILE; SQL> ALTER SYSTEM SET shared_pool_size = 2G SCOPE = SPFILE;
Sonrasında veritabanını yeniden başlatmak gerekecektir.
Result Cahce kullanımı için sorguya /*+ RESULT_CACHE */ hinti eklemek gerekmektedir. Örnek sorgu aşağıdaki gibidir.
SQL> SELECT /*+ RESULT_CACHE */ p.prod_name, SUM (s.amount_sold) AS total_revenue, SUM (s.quantity_sold) AS total_sales FROM sales s, products p WHERE s.prod_id = p.prod_id GROUP BY p.prod_name;
Result cahce kullanımı varsayılan olarak manuel yönetilmektektedir. Dilersek bunu zorlayarak otomatik kullanılmasını da sağlayabiliriz. result_cache_mode parametresinin değerine göre bu kullanım mümkündür. Varsayılan olarak MANUAL şeklinde olup dilersek FORCE yaparak result cache kullanımına zorlayabiliriz sistemi. Kullanım durumu result_cache_max_size parametresi ile sınırlandırılmaktadır.
result_cache_mode parametresini aşağıdaki gibi değiştirebiliriz.
SQL> alter system set result_cache_mode=FORCE scope=both sid='*'; System altered.
result_cache_mode parametresi FORCE yapıldığında bile eğer sorguda NO_RESULT_CACHE hinti belirtildiyse , result cache kullanılmayacaktır. Hint , daima parametreden daha üstündür.
Cache’lenmiş nesneleri sorgulamak :
Aşağıdaki sorgu ile result cache kullanılan nesneleri tespit edebilirsiniz.
SQL> SELECT name, TYPE, cache_id, row_count FROM v$result_cache_objects ORDER BY creation_timestamp;
Result cache bilgilerinin bazı durumlarında temizlenmesi gerekebilir. Mevcut cache bilgilerini aşağıdaki şekilde temizleyebilirsiniz.
SQL> BEGIN DBMS_RESULT_CACHE.FLUSH; END; / PL/SQL procedure successfully completed.
Result Cache kullanıldığında bellek tarafındaki durumun da izlenmesi gerekir. Bu izlemeyi Result Cache Memory Report ile sağlamak mümkündür. Bu raporu aşağıdaki şekilde oluşturabilirsiniz. Bu rapor sayesinde anlık olarak bellek kullanımını ve ayarlamalarını görebiliriz.
SQL> set serveroutput on SQL> exec dbms_result_cache.memory_report(TRUE); R e s u l t C a c h e M e m o r y R e p o r t [Parameters] Block Size = 1K bytes Maximum Cache Size = 52448K bytes (52448 blocks) Maximum Result Size = 2622K bytes (2622 blocks) [Memory] Total Memory = 174336 bytes [0.004% of the Shared Pool] ... Fixed Memory = 14880 bytes [0.000% of the Shared Pool] ....... Memory Mgr = 200 bytes ....... Cache Mgr = 208 bytes ....... Bloom Fltr = 2K bytes ....... = 4120 bytes ....... RAC Cbk = 5408 bytes ....... State Objs = 2896 bytes ... Dynamic Memory = 159456 bytes [0.004% of the Shared Pool] ....... Overhead = 126688 bytes ........... Hash Table = 64K bytes (4K buckets) ........... Chunk Ptrs = 24K bytes (3K slots) ........... Chunk Maps = 12K bytes ........... Miscellaneous = 126688 bytes ....... Cache Memory = 32K bytes (32 blocks) ........... Unused Memory = 31 blocks ........... Used Memory = 1 blocks ............... Dependencies = 0 blocks (0 count) ............... Results = 1 blocks ................... SQL = 1 blocks (1 count) PL/SQL procedure successfully completed.
Result Cache ile ilgili bilgi alabileceğiniz diğer bir view ise v$result_cache_statistics şeklindedir. Bu görüntüden de mevcut durum ile ilgili bilgi toplanabilir.
SQL> select name, value from v$result_cache_statistics; NAME VALUE ------------------------------ -------------------- Block Size (Bytes) 1024 Block Count Maximum 3072000 <<<<<<<<<<< 3 GB Result Cache maximum size Block Count Current 1038720 <<<<<<<<<<< 1 GB is currently used Result Size Maximum (Blocks) 153600 Create Count Success 1047967 Create Count Failure 80 Find Count 1312482070 Invalidation Count 9056 Delete Count Invalid 9402 Delete Count Valid 0 Hash Chain Length 237-269 Find Copy Count 1312537867 Latch (Share) 0
Bilgiler için teşekkürler.