딕셔너리 캐시(일명 로우캐시 )

  • 오브젝트 정의를 저장 하는 곳
  • 관련 뷰 :v$rowcache =v$rowcache_parent + v$rowcache_subordinate

SQL>   select cache#, parameter, type, subordinate#, count, usage, fixed, gets ,getmisses
       from v$rowcache order by cache#, type, subordinate# ; 

  CACHE# PARAMETER                        TYPE        SUBORDINATE#      COUNT      USAGE      FIXED       GETS  GETMISSES
---------- -------------------------------- ----------- ------------ ---------- ---------- ---------- ---------- ----------
         0 dc_tablespaces                   PARENT                           10         10          0   17216006         87
         1 dc_free_extents                  PARENT                            0          0          0          0          0
         2 dc_segments                      PARENT                          926        926          0    2761891      47480
         3 dc_rollback_segments             PARENT                           25         25          1    3051290         24
         4 dc_used_extents                  PARENT                            0          0          0          0          0
         5 dc_tablespace_quotas             PARENT                            0          0          0        220         32
         6 dc_files                         PARENT                           11         11          0      43505         44
         7 dc_users                         SUBORDINATE            0          5          5          0     243337        145
         7 dc_users                         SUBORDINATE            1         33         33          0    1509468        431
         7 dc_users                         SUBORDINATE            2          0          0          0          0          0
         8 dc_objects                       PARENT                          1849      1849        116   13042484     168133
         8 dc_object_grants                 SUBORDINATE            0         10         10          0      34906       8087

  • GET : Data dictionary 의 요구 횟수
  • GETMISSES : Cache Miss를 발생시키는 데이터 요구 횟수
  • COUNT : 사용 가능한 Cache Entry 총수
  • USAGE : 그 중에서 데이터를 저장하고 있는 Cache Entry 수
    딕셔너리 캐시의 로우들은 Parent 와 Subordinate(종속된) 두 개의 그룹으로 구분
    예) db_objects(테이블 정보), dc_object_grants(grant 정보)

SQL 수행을 위해 필요한 OBJECT 정보


Select count(*) from all_objects ;

  • 쿼리 수행 시, 필요한 세 개의 all_objects 항목
    *1. Sys의 view
    *2. Public synonym
    *3. 필자의 스키마에 의해 소유된 non-existence

Non-existent 오브젝트


SQL> create or replace view my_objects as select * from user_objects ;
View created.

SQL> select referenced_owner, referenced_name, referenced_type
2  fromuser_dependencies
3  where name ='MY_OBJECTS';

REFERENCED_OWNER      REFERENCED_NAME                REFERENCED_TYPE
------------------------------ ------------------------------ -----------------
PUBLIC                         USER_OBJECTS                   SYNONYM
OPS$ORACLE                     USER_OBJECTS                   NON-EXISTENT

SQL> select referenced_owner, referenced_name, referenced_type
from user_dependencies
where name ='TEST_OBJECTS';

REFERENCED_OWNER               REFERENCED_NAME                                                  REFERENCED_TYPE  
------------------------------ ---------------------------------------------------------------- -----------------
PUBLIC                         USER_OBJECTS                                                     SYNONYM          
OPS$ORACLE                     USER_OBJECTS                                                     NON-EXISTENT     

2 rows selected.

SQL> CREATE TABLE USER_OBJECTS ( A1 NUMBER );

Statement Processed.

SQL>  
select referenced_owner, referenced_name, referenced_type 
from user_dependencies 
where name ='TEST_OBJECTS';

REFERENCED_OWNER               REFERENCED_NAME                                                  REFERENCED_TYPE  
------------------------------ ---------------------------------------------------------------- -----------------
PUBLIC                         USER_OBJECTS                                                     SYNONYM          
OPS$ORACLE                     USER_OBJECTS                                                     TABLE            

2 rows selected.


  • 현재 필자의 스키마에 속하지 않는 user_objects 라고 불리는 실제 오브젝트에 좌우됨
  • 만일 필자.user_objects 라는 실제 오브젝트를 생성하면,
    오라클은 non-existent 에 대한 종속성 제거(이로써 my_objects뷰 정의 무효화됌 )
    Non-Existent : 데이터 딕셔너리에는 존재하지 않지만, 딕셔너리 캐시에는 존재
    데이터딕셔너리 : 데이터베이스의 객체에 대한 설명 저장

오라클이 메모리 내의 오브젝트 리스트 유지 방법 :

  1. 버퍼 캐시, 라이브러리 캐시 및 euqueue 와 같은 방법
  2. 즉, 해시 체인 래치들의 집합, 해시 체인 및 링크드 리스트를 이용해 관리
    추론 근거 : V$ROWCACHE_PARENT 와 V$ROWCACHE_SUBORDINATE 뷰에 HASH 칼럼

딕셔너리 캐시 구조

: V$rowcache뷰의 한 로우와 v$rowcache_parent 및 v$rowcache_subordinate뷰 관계로 이해

  1. 부모 유형과 종속 유형은 별로 관리
  2. 버킷 내의 부모 항목 간에, 그리고 부모 항목과 종속 항목간에 이중 링크드 리스트연결


[그림 7-1] 딕셔너리 캐시의 subset

딕셔너리 캐시 메모리 크기 확인


SQL> select * from v$sgastat where name like '%KQR%' order by name

POOL         NAME                            BYTES
------------ -------------------------- ----------
shared pool  KQR ENQ                         90816
shared pool  KQR L PO                       694960
shared pool  KQR L SO                       125992
shared pool  KQR M PO                      2199792
shared pool  KQR M SO                       549968
shared pool  KQR S SO                        26128
shared pool  KQR X PO                        30840

7 rows selected.

  • KQR :rowcache 와 관련
  • ENQ : row cache enqueues 일 것이다.
  • X/L/M/S 는 e(X)tra large / (L)arge / (M)edium / (S)mall
  • PO/SO 는 부모 오브젝트(x$kqrpd), 종속 오브젝트(x$kqrsd)를 의미

딕셔너리 캐시 활동성

딕셔너리 캐시 내의 항목을 찾기 위해 해시 체인을 탐색하는 동안에 해시 체인이 변경되지 않도록 보호해야 한다.
딕셔너리 캐시 활동의 핵심은 해시 버킷과 해시 체인에 근거하며, 해시 체인은 읽기/쓰기 충돌로부터 보호되어야 함

테스트 주요 SP 설명
Snap_latch_child – v$latch_child뷰의 스냅샷 제공
Snap_rowcache -- v$rowcache뷰의 스냅샷 제공

CASE1) Literal SQL 에 1000번 수행


결과


  • 딕셔너리 캐시를 한 번 획득하면 이와 관련된 래치는 세 번 획득 해야 함
  1. 테이블과 인덱스 액세스 하므로 dc_segments를두번 액세스
  2. 인증을 위해서 쿼리 마다 dc_users 한번 액세스
  3. dc_objects 와 유_objects_ids 는 총 4000번 액세스(테이블(1000번), 인덱스(3000)번)
  4. dc_histogram_defs를 2000번 액세스(쿼리내에서 참조하는 칼럼에 액세스만큼, n1,t1)