Result cache

Server Result cache нь Shared Pool -д байрлах query-ийн үр дүнг хадгалах зориулалттай жижиг хэмжээний санах ой юм. Энэ хэсэгт олон давтамжтай, байнга шинэчилэгддэггүй мэдээллүүдийг хадгалах нь зохимжтой. Хэрэв SGA -ийн хэмжээ автоматаар зохицуулагддаг (ASMM) бол Oracle database нь SGA_TARGET-ийн 0.5% автомат биш бол SHARED_POOL_SIZE-ийн 1% тай тэнцэх хэмжээг RESULT_CACHE хэсэгт оноож өгдөг.
Хэр хэмжээ оноогдож өгснийг дараах коммандаар харна.

SQL> show parameter result_cache_max_size

Хэрэв дээрх утга 0 байвал result_cache нь instance эхлэх үед идэвхгүй болно гэсэн үг. Хэрэв уг утгыг өөрчилсөн бол баазаа унтрааж асаалгүйгээр идэвхжсэн эсэхийг эхлээд дараах коммандаар шалгаарай.

SQL>  SELECT dbms_result_cache.status() FROM dual;

DBMS_RESULT_CACHE.STATUS()
--------------------------------------------------------------------------------
ENABLED

SQL>

Result Cache -ийн үндсэн утга нь MANUAL байх бөгөөд энэ нь зөвхөн заасан утгуудыг хадгална гэсэн тохиргоо юм. Хэрэв FORCE тохиргоотой болговол бүх SELECT утгыг хадгалах бөгөөд энийг ашиглах шаардлага гарахгүй болов уу.

SQL> show parameter result_cache_mode

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
result_cache_mode                    string      MANUAL

Ашиг тусын хувьд тухайн програм хангамж, хэрэгцээнээс шалтгаалж адил биш байх бөгөөд сайн судлаж тооцоолсны үндсэн дээр хэрэгтэй тохиолдлыг нарийн тооцоолж ашиглах хэрэгтэй.

Ажиллах зарчим нь result_cache ашиглах тохиргоо бүхий хүснэгтнээс сонгосон үр дүнг эсвэл query -ийн үр дүнг хамгийн эхэнд дуудах үед уг хэсэгт санах ойд байршуулна. Харин дараагийн хэрэглэгч яг ижил коммандыг ажиллуулсан тохиолдолд result_cache хэсгээс мэдээллийг шууд харуулдаг.

Жишээ:

SQL> SELECT department_id, AVG(salary) FROM hr.employees GROUP BY department_id;

DEPARTMENT_ID AVG(SALARY)
------------- -----------
	  100  8601.33333
	   30	     4150
		     7000
	   20	     9500
	   70	    10000
	   90  19333.3333
	  110	    10154
	   50  3475.55556
	   40	     6500
	   80  8955.88235
	   10	     4400

DEPARTMENT_ID AVG(SALARY)
------------- -----------
	   60	     5760

12 rows selected.


Execution Plan
----------------------------------------------------------
Plan hash value: 1192169904

--------------------------------------------------------------------------------
| Id  | Operation	   | Name      | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |	       |    11 |    77 |     4	(25)| 00:00:01 |
|   1 |  HASH GROUP BY	   |	       |    11 |    77 |     4	(25)| 00:00:01 |
|   2 |   TABLE ACCESS FULL| EMPLOYEES |   107 |   749 |     3	 (0)| 00:00:01 |
--------------------------------------------------------------------------------


Statistics
----------------------------------------------------------
	  0  recursive calls
	  0  db block gets
	  7  consistent gets
	  0  physical reads
	  0  redo size
	853  bytes sent via SQL*Net to client
	523  bytes received via SQL*Net from client
	  2  SQL*Net roundtrips to/from client
	  0  sorts (memory)
	  0  sorts (disk)
	 12  rows processed

SQL>

Дээрхи коммандыг хэд хэд ажиллуулахад DB buffer cache-с уншилт хийж (consistent gets) буйг харж болно. Харин одоо result_cache hint ашиглаж дээрх коммандыг ашиглаж үзье.

SQL> SELECT /*+ RESULT_CACHE */ department_id, AVG(salary)
  FROM hr.employees
 GROUP BY department_id;  2    3

DEPARTMENT_ID AVG(SALARY)
------------- -----------
	  100  8601.33333
	   30	     4150
		     7000
	   20	     9500
	   70	    10000
	   90  19333.3333
	  110	    10154
	   50  3475.55556
	   40	     6500
	   80  8955.88235
	   10	     4400

DEPARTMENT_ID AVG(SALARY)
------------- -----------
	   60	     5760

12 rows selected.


Execution Plan
----------------------------------------------------------
Plan hash value: 1192169904

--------------------------------------------------------------------------------------------------
| Id  | Operation	    | Name			 | Rows  | Bytes | Cost (%CPU)| Time	 |
--------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |				 |    11 |    77 |     4  (25)| 00:00:01 |
|   1 |  RESULT CACHE	    | 3w0d0687vphfr3gvhgbcpfg89s |	 |	 |	      | 	 |
|   2 |   HASH GROUP BY     |				 |    11 |    77 |     4  (25)| 00:00:01 |
|   3 |    TABLE ACCESS FULL| EMPLOYEES 		 |   107 |   749 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------------------------------

Result Cache Information (identified by operation id):
------------------------------------------------------

   1 - column-count=2; dependencies=(HR.EMPLOYEES); name="SELECT /*+ RESULT_CACHE */ department_id,
AVG(salary)
  FROM hr.employees
 GROUP BY department_id"



Statistics
----------------------------------------------------------
	  0  recursive calls
	  0  db block gets
	  0  consistent gets
	  0  physical reads
	  0  redo size
	853  bytes sent via SQL*Net to client
	523  bytes received via SQL*Net from client
	  2  SQL*Net roundtrips to/from client
	  0  sorts (memory)
	  0  sorts (disk)
	 12  rows processed

SQL>

Дээрхи коммандыг мөн хэд хэд ажиллуулж үзвэл DB Buffer Cache-с ямар уншилт хийхгүй байгааг харж болох бөгөөд Result Cache хэсэгт ямар кодтой (cache_id) хадгалагдсан мэдээлэл харагдаж байна. Уг хаягаар тухайн ?result cache-д буй мэдээллийн агуулгыг харж болно. Үүний тулд дараах коммандыг ашиглана.

SQL> SELECT id, type, creation_timestamp, block_count,
       column_count, pin_count, row_count
  FROM V$RESULT_CACHE_OBJECTS
 WHERE cache_id = '3w0d0687vphfr3gvhgbcpfg89s'  2    3    4
  5  /

	ID TYPE       CREATION_ BLOCK_COUNT COLUMN_COUNT  PIN_COUNT  ROW_COUNT
---------- ---------- --------- ----------- ------------ ---------- ----------
	 1 Result     25-JAN-17 	  1	       2	  0	    12

SQL>

Result Cache санах ойн тайланг харахын тулд дараах коммандыг ашиглана.

SQL> set serveroutput on size unlimited
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  = 2112K bytes (2112 blocks)
Maximum Result Size = 105K bytes (105 blocks)
[Memory]
Total Memory = 167032 bytes [0.063% of the Shared Pool]
... Fixed Memory = 10696 bytes [0.004% of the Shared Pool]
....... Memory Mgr = 200 bytes
....... Bloom Fltr = 2K bytes
....... Cache Mgr  = 5552 bytes
....... State Objs = 2896 bytes
... Dynamic Memory = 156336 bytes [0.059% of the Shared Pool]
....... Overhead = 123568 bytes
........... Hash Table	  = 64K bytes (4K buckets)
........... Chunk Ptrs	  = 24K bytes (3K slots)
........... Chunk Maps	  = 12K bytes
........... Miscellaneous = 21168 bytes
....... Cache Memory = 32K bytes (32 blocks)
........... Unused Memory = 30 blocks
........... Used Memory = 2 blocks
............... Dependencies = 1 blocks (1 count)
............... Results = 1 blocks
................... SQL     = 1 blocks (1 count)

PL/SQL procedure successfully completed.

SQL>

Result Cache -д 4 төрлийн view ашиглагдана. Үүнд:

  • V$RESULT_CACHE_DEPENDENCY
  • V$RESULT_CACHE_MEMORY
  • V$RESULT_CACHE_OBJECTS
  • V$RESULT_CACHE_STATISTICS

Эдгээрээс шүүлт хийн cache-д ямар мэдээллүүд байгаа болон түүнтэй холбоотой бусад нэмэлт мэдээллүүдийг гаргаж харах боломжтой.

Жишээ нь:

SQL> col name for a40
SQL> col value for a20
SQL> select * from v$result_cache_statistics;

 ID    NAME 				             VALUE
---- ----------------------------------- --------------------
	 1 Block Size (Bytes)			    1024
	 2 Block Count Maximum			    2112
	 3 Block Count Current			    32
	 4 Result Size Maximum (Blocks) 	105
	 5 Create Count Success 		    1
	 6 Create Count Failure 		    0
	 7 Find Count				        6
	 8 Invalidation Count			    0
	 9 Delete Count Invalid 		    0
	10 Delete Count Valid			    0
	11 Hash Chain Length			    1

11 rows selected.

SQL>

Өөр нэг төрлийн result cache байдаг бөгөөд үүнийг CLIENT RESULT CACHE гэж нэрлэдэг. Хэрэглэгчийн процест байрлах бөгөөд мэдээллийг тухайн процесыг ашиглаж буй бүх session түгээж байдаг.

Client Result cache хэрхэн ажилладаг талаар дараах зурагтай танилцана уу

Статистикийг дараах коммандаар харна.

SQL> SELECT stat_id, SUBSTR(name,1,20), value, cache_id
  FROM CLIENT_RESULT_CACHE_STATS$
 ORDER BY cache_id, stat_id;

STAT_ID    NAME OF STATISTICS      VALUE   CACHE_ID
=======    ==================      =====   ========
    1      Block Size               256         124
    2      Block Count Max          256         124
    3      Block Count Current      128         124
    4      Hash Bucket Count       1024         124
    5      Create Count Success      10         124
    6      Create Count Failure       0         124
    7      Find Count                12         124
    8      Invalidation Count         8         124
    9      Delete Count Invalid       0         124
   10      Delete Count Valid         0         124
3 Likes