[Oracle] Sequence의 cache_size

HYEOB KIM·2023년 5월 31일
0

Oracle

목록 보기
40/58

시퀀스에 cache_size 파라미터가 있습니다.
size라 적혀있지만 용량의 개념은 아니고 번호의 개수입니다.

예를 들어 cache_size = 20이라면
해당 시퀀스는 메모리에 1~20까지의 채번을 미리 만들어서 적재해 놓습니다.

시퀀스에서 채번을 가져다 쓸 때 메모리에 생성되어 있는 채번을 바로 가져다 쓰면 되기 때문에 빠른 성능을 낼 수 있습니다.

채번은 메모리에 올라가 있기 때문에 DB를 내리면 같이 없어지며
다시 DB를 올리게 되면 사라지기 이전 채번의 마지막 번호부터 cache_size만큼 채번이 생성되어 메모리에 적재됩니다.

예를 들어, cache_size = 20인데
DB를 내리면 1~20까지의 채번이 모두 날아가고
DB를 다시 올렸을 때 21~40까지의 채번이 새로 적재됩니다.

만약 메모리에 적재된 채번을 쓰는 경우에
메모리의 모든 채번을 소진해야 새로운 채번들로 다시 채워집니다.
이 작업 과정에서 약간의 딜레이가 있을 수 있습니다.

예를 들어, cache_size = 20이라면
40개의 insert가 발생했을 때 메모리에 적재된 20개의 채번을 모두 소진하고 나면
다시 20개가 채워지고, 20개를 소진합니다.

채번이 어디까지 진행되었나의 정보는 Data Dictionary에 적재되어 있습니다.

v$session_event 뷰의 상위 5개의 wait event에서 row cache lock이 있다면 시퀀스의 경합을 판단할 수 있습니다.

SQL> select
  2     *
  3  from
  4     (select
  2         event,
  3         total_waits,
  4         time_waited
  5      from
  6         v$session_event
  7      where
  8         sid=SYS_CONTEXT('USERENV','SID')
  9      order by
 10         time_waited desc)
 11  where
 12     rownum <= 5;
 
EVENT                          TOTAL_WAITS TIME_WAITED
------------------------------ ----------- -----------
row cache lock                       94154       40306
gc cr block lost                       393       17826
gc current block lost                  371       17462
gc cr block busy                     37397        6731
gc current block 2-way               93214        5587

v$session_wait 뷰를 통해 보면 row cache lock의 P1에 object type 번호가 나타는데, 해당 번호를 통해
v$rowcache 뷰에서 where cache#=<object type number>를 통해 조회하면 해당 object type이 나타나고, GETS, GETMISSES를 확인할 수 있습니다.

SQL> select
  2     event,
  3     p1,
  4     p2,
  5     p3
  6  from
  7     v$session_wait
  8  where
  9     sid=SYS_CONTEXT('USERENV','SID');
 
EVENT                             P1        P2       P3
------------------------- ---------- ---------- ----------
row cache lock                    13         0        5

SQL> select          
  2     parameter,
  3     gets,
  4     getmisses
  5  from
  6     v$rowcache
  7  where
  8     cache#=13;
 
PARAMETER                  GETS  GETMISSES
-------------------- ---------- ----------
dc_sequences              64740      64283

RAC 환경에서 cache_size를 사용할 경우 한쪽 노드의 메모리에 적재됩니다. 각 노드에 부하 테스트를 해보면 경과 시간이 좀 더 빠른 노드의 메모리에 시퀀스의 채번이 적재되어 있다는 의미가 됩니다.

통상적으로 100~1000 사이 정도의 cache_size를 권장합니다.
1000 이상일 경우 성능이 그리 극적으로 개선되진 않습니다.


참고

profile
Devops Engineer

0개의 댓글