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