오라클 성능 고도화 원리와 해법 I (2012년)
Shared Pool 0 0 99,999+

by 구루비스터디 Shared Pool [2018.03.20]


  1. Shared Pool
    1. (1) 딕셔너리 캐시
    2. (2) 라이브러리 캐시


Shared Pool

(1) 딕셔너리 캐시

  • 오라클 딕셔너리 정보를 저장해 두는 캐시영역으로서 Row단위로 읽고 쓰기 때문에 '로우 캐시' 라고도 불린다.
  • 테이블, 인덱스, 테이블스페이스, 테이터파일, 세그먼트, 익스텐트, 사용자, 제약, Sequence, DB Link에 관한 정보를 캐싱한다.
  • 딕셔너리 캐시의 활동성에 대한 통계를 조회해 볼 수 있는 뷰가 v$rowcache인데 여기서 히트를 조사했을 때 수치가 낮게 나오면 Shared Pool 사이지를 늘리는 것을 고려해 볼 필요가 있다.

SQL>  SELECT ROUND( SUM(GETS - GETMISSES) / SUM(GETS) * 100, 2) HIT_RATIO 
  2   FROM V$ROWCACHE;

 HIT_RATIO
----------
     99.18

SQL>  SELECT PARAMETER
  2            , GETS
  3            , GETMISSES
  4            , ROUND((GETS-GETMISSES)/ GETS * 100, 2) HIT_RATIO
  5            , MODIFICATIONS
  6    FROM V$ROWCACHE
  7  WHERE GETS > 0
  8  ORDER BY HIT_RATIO DESC;

PARAMETER                              GETS  GETMISSES  HIT_RATIO MODIFICATIONS
-------------------------------- ---------- ---------- ---------- -------------
dc_tablespaces                      5869348         17        100             0
dc_awr_control                       203615          1        100          6288
dc_profiles                          186541          1        100             0
dc_users                            8288476        102        100             9
dc_rollback_segments                3797577         36        100            23
dc_usernames                         821290         74      99.99             0
dc_global_oids                      1151936        239      99.98             0
dc_users                             202051         65      99.97             0
dc_histogram_data                   1265253       1227       99.9             0
dc_files                               7560         14      99.81             0
dc_object_ids                       9380099      18851       99.8          6869

PARAMETER                              GETS  GETMISSES  HIT_RATIO MODIFICATIONS
-------------------------------- ---------- ---------- ---------- -------------
dc_segments                         3199432       8966      99.72         32545
dc_sequences                           9087         42      99.54          9087
dc_objects                          4789191      28512       99.4         39237
dc_database_links                      1422         12      99.16             0
dc_histogram_data                   5266470      50773      99.04          7865
dc_histogram_defs                   9291607     273007      97.06         34122
dc_tablespace_quotas                    107          4      96.26           107
dc_object_grants                      14766        596      95.96             0
outstanding_alerts                   716191      63949      91.07        127833
dc_constraints                           48         17      64.58            48
dc_table_scns                            19         19          0             0


  • V$ROWCACHE 에서 TYPE = 'PARENT'인 엔트리와 V$LATCH_CHILDREN 에서 row cache objects 인 래치 개수를 조회해 보면, 항상 값이 일치하는 것을 알 수 있다.
  • 로우 캐시에 관리되는 엔트리 각각에 대해 하나의 래치가 할당돼 있음을 있음을 짐작 할 수 있다.



SQL>  SELECT *
  2    FROM (SELECT COUNT(*) FROM V$ROWCACHE WHERE TYPE = 'PARENT' )   
  3      , (SELECT COUNT(*) FROM V$LATCH_CHILDREN WHERE NAME = 'row cache objects')
  4  ;

  COUNT(*)   COUNT(*)
---------- ----------
        34         34



(2) 라이브러리 캐시

  • DB 버퍼 캐시, Redo 로그 버퍼 캐시, 딕셔너리 캐시 등은 데이터의 입출력을 빠르게 하기 위한 캐시영역인 반면 라이브러리 캐시는 사용자가 던진 SQL과 그 실행 계획을 저장해 두는 캐시영역이다.
  • 사용자가 SQL이라는 명령어를 통해 결과집합을 요청하면 이를 최적으로수행하기 위한 처리 루틴이 필요한데, 이걸 실행 계획이라고 한다.
  • 빠른 쿼리 수행을 위해 내부적으로 생성한 일종의 프로시저오 같은 것이라고 이해하면 쉽다


하드파싱
  • 1. 쿼리 구문을 분석
  • 2. 문법 오류 및 실행 권한 등을 체크
  • 3. 최적화 과정을 거쳐 실행계획 생성 - 최적하는 하드 파싱을 무겁게 만드는 가장 결정적인 요인
  • 4. SQL 실행엔진이 이해할 수 있는 형태로 포맷팅


소프트파싱
  • 같은 SQL을 처리하려고 이런 무거운 작어블 반복 수행하는 것은 매우 비효율적이다.
  • 그래서 같은 SQL에 대한 반복적인 하드파싱을 최소화하기 위한 새로운 캐시 공간을 두게 되었고, 그것이 바로 라이브러리 캐시 영역이다.
  • 당연히 라이브러리 캐시 최적화 원리는 캐싱된 SQL과 그 실행계획의 재사용성을 높이는데 있다.
코어 오라클 데이터베이스 스터디 모임 에서 2012년에 오라클 성능 고도화 원리와 해법 I 도서를 스터디하면서 정리한 내용 입니다.

- 강좌 URL : http://www.gurubee.net/lecture/3075

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입