1. Event 정의

1) 정의
  • DML 수행 시 변경 내용을 Redo Buffer에 저장하기 위해 공간이 확보되기를 대기하는 Event
p1N/A
p2N/A
p3N/A
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 옵션을 부여하는 것이 이 방법임

문서에 대하여