DFS lock handle 이벤트 발생 시나리오
- ORDER 속성을 가진 시퀀스를 생성하되 캐시의 크기를 20(Default)로 하면 각 노드는 1~20의 시퀀스 값을 가지고 있게 된다.
- 각 노드마다 10개의 세션들이 동시에 NEXTVAL을 호출한다.
- 시퀀스 값을 요청할 때 마다 현재 시퀀스 값 중 마지막으로 사용된 값을 찾기 위해 다른 노드들과 통신을 한다. 가령, 노드A에서 1~3까지 먼저 사용하였고, 노드B에서 시퀀스 값을 요청했다면 노드A가 어디까지 사용했는지 확인 후에야 노드B는 4를 제공 하는 것이 가능해진다.
- 이와 같은 작업은 노드간에 동기화를 필요로 하므로 DFS lock handle 이라는 이벤트대기가 발생하게 된다.
DFS lock handle 이벤트 대기 발생 이유
- NEXTVAL이 호출될 때마다 마지막으로 사용된 시퀀스 값을 확인하기 위한 다른 노드들과의 동기화 작업은 반드시 SV락을 획득한 후에 가능하므로 SV락 경합이 발생하게 된다.
- 더욱이 시퀀스의 CACHE 속성이 20(Default)으로 작아, 딕셔너리 변경이 잦아지고 이로 인해 SV 락을 보유하는 시간이 증가함에 따라 이를 대기하는 다른 세션들의 대기시간은 더욱 길어지게 된다.
- 노드간의 시퀀스에 대한 동기화의 보호는 SV락을 통해서 이루어지며, 이 대기는 DFS lock handle 이벤트로 확인된다.
성능 개선 방법
노드간 시퀀스 값 동기화를 가능하면 줄일 수 있는 방법
- 시퀀스에서 ORDER 속성을 제거하면 동기화 과정 자체가 필요 없어지므로 가장 효과적으로 문제를 해결할 수 있으므로 업무를 확인하여 ORDER 속성 제거를 검토한다.
- ORDER속성을 제거하는 것이 불가능하다면 CACHE 속성을 충분히 크게 하여 잦은 딕셔너리 변경으로 인해 낭비되는 시간을 최소화 한다.
'DB - ORACLE > DB Tunning(TABLE,SQL,...)' 카테고리의 다른 글
[TD-ORACLE] foreign key 생성시 인덱스가 없을 경우 (0) | 2017.11.10 |
---|---|
인덱스 사용 현황 모니터링 (0) | 2016.03.23 |
Segment shrinking (0) | 2016.01.02 |
풀 테이블 스캔으로 시스템 리소스 증가하는 쿼리 튜닝 (0) | 2015.12.30 |
Latch & Lock (0) | 2015.12.30 |