시퀀스에 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 이상일 경우 성능이 그리 극적으로 개선되진 않습니다.
참고