1. Event 정의
1) 정의
- DML 수행 시 변경 내용을 Redo Buffer에 저장하기 위해 공간이 확보되기를 대기하는 Event
2) 대기발생 사유
- Redo Buffer의 크기가 너무 작은 경우
- 느린 I/O Subsystem으로 인해 LGWR 프로세스가 Redo 데이터 발생 정도를 수용하지 못할 경우
2. log buffer space 대기
1) log buffer space 프로세스
- 리두 버퍼에 리두 레코드를 기록하려는 프로세스는 리두 버퍼 내에 필요한 공간을 확보하기 위해 redo allocation 래치를 획득해야 한다.
- redo allocation 래치를 획득한 상태에서 리두 버퍼에 공간을 확보하려는 순간에 적절한 여유공간이 없는 경우, 공간이 확보되기를 기다려야 한다.
- 이 때, 경우에 따라 두 가지 종류의 이벤트를 대기하게 된다.
- 만일 현재 사용중인 리두 로그 파일이 꽉 차서 더 이상 여유공간을 확보할 수 없다면, LGWR은 로그 파일 스위치(log file switch)를 수행하고, 서버 프로세스는 log file switch completion 이벤트를 대기한다.
- 그 외의 경우에는 log buffer space 이벤트를 대기하게 된다. 전자의 경우, 로그 파일 스위치가 끝난 직후 log buffer space 대기가 한꺼번에 증가하는 현상이 생길 수 있다.
- 이는 리두 버퍼에 기록을 하려는 다수의 세션들이 로그 파일 스위치가 끝나기를 기다렸다가 한꺼번에 리두 버퍼에 기록을 하기 위해 경쟁하기 때문이다.
2) 테스트 시나리오
☞ 13만건 정도의 로우를 지닌 TEST 테이블에 대해 Update를 수행한다.
☞ Case1에서는 리두 버퍼의 크기를 256 K로 지정한다.
☞ Case2에서는 리두 버퍼의 크기를 5 M로 지정한다.
☞ 두 Case에서 log buffer space 대기가 어떻게 발생하는지 확인한다.
3) 리두 버퍼의 크기가 256 K로 매우 작게 설정된 경우
-- 1. SGA 확인
SHOW SGA
Total System Global Area 314,572,800 bytes
Fixed Size 788,692 bytes
Variable Size 263,190,316 bytes
Database Buffers 50,331,648 bytes
Redo Buffers 262,144 bytes
-- 2. UPDATE 수행
UPDATE TEST
SET ID = ID,
NAME = NAME;
131079 rows updated.
-- 3. 대기이벤트 확인
SELECT EVENT,
TOTAL_WAITS,
TIME_WAITED
FROM V$SESSION_EVENT
WHERE SID = (SELECT SID
FROM V$MYSTAT
WHERE ROWNUM = 1)
ORDER BY 3 DESC;
EVENT TOTAL_WAITS TIME_WAITED
------------------------------------------- ----------- -----------
SQL*Net message from client 19 24819
log buffer space 1582 6234 -- 많은 대기 소요
db file scattered read 616 4297
log file switch completion 89 1210 -- 많은 대기 소요
db file sequential read 1073 1202
log file switch (checkpoint in complete) 4 137
4) 리두 버퍼의 크기를 5 M로 크게 설정한 경우
-- 1. LOG_BUFFER 늘림
ALTER SYSTEM SET LOG_BUFFER=5242880 SCOPE=SPFILE;
-- 2. SGA 확인
SHOW SGA
Total System Global Area 314,572,800 bytes
Fixed Size 788,692 bytes
Variable Size 258,209,580 bytes
Database Buffers 50,331,648 bytes
Redo Buffers 5,242,880 bytes -- 사이즈 증가
-- 3. UPDATE 수행
UPDATE TEST
SET ID = ID,
NAME = NAME;
131079 rows updated.
-- 4. 대기이벤트 확인
SELECT EVENT,
TOTAL_WAITS,
TIME_WAITED
FROM V$SESSION_EVENT
WHERE SID = (SELECT SID
FROM V$MYSTAT
WHERE ROWNUM = 1)
ORDER BY 3 DESC;
EVENT TOTAL_WAITS TIME_WAITED
---------------------------------- ----------- -----------
db file scattered read 817 4783
SQL*Net message from client 18 3718
log buffer space 66 3455 -- 기존에 1,582에서 66으로 줄어든 것 확인
log file switch completion 115 2651
db file sequential read 1208 2103
free buffer waits 1160 944
log file sync 2 10
latch: cache buffers lru chain 2 1
latch: cache buffers chains 2 1
latch: redo allocation 1 1
latch: shared pool 1 1
3. 해결방안
1) Redo Buffer의 크기 증가
- log Buffer Space 대기는 트랜잭션에 의해 생성되는 redo의 양에 비해 리두 버퍼의 크기가 작을 때 발생
- 그러므로, log Buffer Space 대기가 광범위하게 나타날때는 리두 버퍼의 크기가 너무 작지 않은가를 조사해 보아야 함
2) NOLOGGING 옵션 사용
- log Buffer SPACE 대기를 줄이는 또 하나의 방법은 리두 데이터를 적게 생성하는 것임
- Direct load 기능을 적당히 사용하고 NOLOGGING 옵션을 부여하는 것이 이 방법임
문서에 대하여