# Result cache

**URL:** <https://www.batmunkh.net/t/result-cache/104>\
**Category:** Tutorials, Solutions\
**Tags:** result\_cache, result-cache\
**Created:** [January 24, 2017, 9:10pm UTC](https://www.batmunkh.net/t/result-cache/104 "2017-01-24T21:10:08Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![batmunkh](https://www.batmunkh.net/user_avatar/www.batmunkh.net/batmunkh/32/297_2.png) [@batmunkh](https://www.batmunkh.net/u/batmunkh)\
**Post date:** [January 24, 2017, 9:10pm UTC](https://www.batmunkh.net/t/result-cache/104/1 "2017-01-24T21:10:08Z")

</div>

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 хэрхэн ажилладаг талаар дараах зурагтай танилцана уу

 ![](https://www.batmunkh.net/uploads/default/original/1X/b47602f3b77611c51b046b7a585f70dad185de11.gif)

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

```
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

```
