| |
##############################
# Wait Event 정리 #
##############################
buffer busy wait : 현재 다른 session에서 사용되고 있는 버퍼 캐쉬의 데이터 블록을 엑세스
하려고 할 때 발생
control file parallel write : session이 모든 컨트롤 파일에 대한 쓰기 I/O 요청이 완료되기를
대기할때 발생
db file parallel read : 병렬처리와는 상관없는 이벤트, 데이터베이스를 복구 수행 시 , 복구해야 하는 블록들을
여러개의 데이터파일로부터 동시에 읽어 들일 때 발생한다.
하나이상의 데이터파일로부터 연속되지 않는 싱글블록들을 동시에 읽어 들일 때 발생한다.
db file parallel write : 병렬처리와는 상관없는 이벤트, 더티블럭을 데이터파일에 기록하는 DBWR프로세스에서만 발생된다.
db file scatterted read : 멀티블록 I/O 요청이 완료하기를 대기하는 세션에 의해 발생
(일반적으로 full table scan 또는 index fast full scant시에 발생됨)
db file sequential read : 싱글블록 I/O 요청이 완료되기를 대기하는 세션에 의해 발생
( 인덱스 스캔, 롤백 또는 언두 세그먼트 읽기, ROWID에 의한 테이블 액세스, 컨트롤파일 재구성
데이터파일 헤더 덤프 또는 데이터파일 헤더를 읽을 때 발생)
db file single write : DBWR에 의해 발생 (일반적으로 checkpoint가 발생하여, 데이터파일의 헤더의 내용을 수정해야 할 때 발생)
==> 데이터베이스에 과도하게 많은 데이터파일이 있을 경우 해당 대기이벤트가 자주 발생함
direct path read : SGA내의 버퍼캐쉬를 거치지 않고 세션의 PGA로 직접 블록을 읽어 들일 때 발생한다.
direct patch write : 세션 PGA 내부의 버퍼로부터 데이터파일로 기록할 때 발생
enqueue : 데이터베이스 리소스에 대한 순차적인 접근을 보장하기 위해 오라클은 enqueue라는 공유메모리 구조를 사용한다.
프로세스는 리소스를 액세스 하기 위해 반드시 enqueue lock을 획득해야한다.
만일 다른세션이 incompatible모드로 리소스에 대한 lock을 소유하고 있는 경우 발생
free buffer waits : 버퍼캐쉬 내부에 데이터블록을 읽어 들이거나, consistent read 이미지를 생성하기 위한 프리버퍼를 찾지
못할 때 발생
latch free : 현재 다른프로세스에 의해 사용되고 있는 래치를 획득하려고 할 때 발생된다. enqueue와 유사하게,
오라클 데이터 구조를 보호하기 위해 래치를 이용한다. 특정 시점에는 하나의 프로세스만이 래치를 획득한 후
데이터 구조를 변경하거나 읽을 수 있다.
(래치를 대기하는 세션들은 큐방식을 사용하지 않는다. 만일 래치 획득하는 것을 실패한다면, 아주 짧은 순간
대기한 후에 래치를 획득하려고 시도한다. 만일 여러번 시도하여도 래치를 획득하지 못할 경우 프로세스는
짧은시간 슬립한 후 래치를 획득하려고 재시도 한다.)
library cache pin : 라이브러리 캐쉬의 동시성과 연관이 있다. 세션이 라이브러리 캐쉬안에 있는 오브젝트를 변경하거나 , 확인하려고 할때
동시에 다른 세션에 의해 오브젝트가 변경되는 것을 방지하기 위해서 반드시 핀을 획득해야 한다.
(현재 많이 사용되는 오브젝트에 대한 DDL 명령을 수행할 경우 library cache pin 대기 이벤트가 많이 발생되게
된다. 따라서 업무시간 중에 오브젝트에 대한 변경은 가급적 삼가해야 한다.
해당 이벤트가 광범위하게 발생된다면, shared pool 에 대한 튜닝이 필요할 수도 있다.)
library cache lock : 라이브러리 캐쉬의 동시성과 연관이 있다. 라이브러리 캐쉬 안에 있는 오브젝트에 대한 동시 액세스를 방지하거나,
상당히 긴 시간 동안 종속성을 관리하거나, 라이브러리 캐쉬로 오브젝트를 적재하려는 세션은 해당 오브젝트
핸들에 대한 락을 획득해야 한다.
log buffer space : 새로운 리두 레코드를 로그버퍼에 기록하려고 할때 가용한 공간이 없을 경우에 발생한다.
해당 대기는 LGWR이 리두로그파일에 기록하는 것보다 빨리 애플리케이션에서 리두정보를 생성한다는 것을 의미 한다.
리두버퍼가 너무 작거나, 리두로그파일이 위치한 디스크 I/O 경합 때문에 발생된다.
log file parallel write : LGWR 프로세스가 로그버퍼의 리두레코드를 리두로그파일에 기록할 때 발생된다.
대기시간이 길다면 리두로그파일이 위치한 디시크의 성능이 좋지 않거나 경합현산이 발생하고 있다고 볼 수 있다.
log file sequential read : ARCH 프로세스가 온라인 리두로그 파일로부터 블록을 읽어 들일 때 발생한다.
log file switch(archiving needed) : LGWR 프로세스가 리두로그 파일에 기록하는 속도를 ARCH프로세스가 따라오지 못할 때 발생한다.
log file switch(checkpoint incomplete) : 로그파일에 대한 체크포인트 프로세스가 완료되지 않아서, 로그파일을 스위치 할 수 없을 때 발생
log file switch completion : 로그파일 스위치가 완료되기를 대기할 때 발생한다.
log file sync : 유저세션이 커밋이나 롤백에 의해서 트랜잭션을 완료한 후 다음 처리를 수행하기 위해서는 LGWR에 의해
리두정보가 리두로그 파일에 기록되어야 한다. 위 상황을 대기하는 발생
SQL*Net message from client : 세션이 클라이언트로 부터의 메시지를 대기할 때 발생
( 대기시간이 과다할 경우, 애플리케이션 소스 코드가 비효율적으로 작성되었거나,
네트워크 레이어 부분이 문제일 수 잇다. )
SQL*Net message to client : 클라이언트로 메시지를 전송할 때 발생된다.
( 클라이언트 프로세스가 메시지를 전송 받을 수 없을 만큼 바쁘게 다른일을 처리하고 있거나
네트워크 지연으로 인해 메시지의 전송시간이 오래 걸릴때 발생)
#############################
# RAC 환경에서의 대기 Event #
#############################
global cache cr request : 리모트 인스턴스에 존재하는 버퍼의 CR 복사본을 읽으려는 세션은, 해당 버퍼가 로컬 인스턴스에 전송
될 때까지 global cache cr request 대기이벤트를 대기한다.
buffer busy global cache : 세션이 리모트 인스턴스의 버퍼에 대한 변경을 하려고 할 때 발생한다.
(10g 부터는 gc buffer busy waits로 변경)
buffer busy global cr : 하나 이상의 세션들이 리모트 인스턴스의 버퍼에 대한 CR 복사본을 순차적으로 기다릴 때 발생
(10g 부터는 gc cr block busy로 변경)
global cache busy : 세션이 shared모드로 소유하고 있는 버퍼에 대한 변경작업을 위해, 해당버퍼를 current 모드로 변경할때까지
대기 이벤트 발생 (일반적으로 리모트 인스턴스의 버퍼를 획득한 후 락모드를 변경할 때 발생한다.)
global cache null to x : 세션이 블록을 변경하려고 할 때, 해당 블록은 로컬 캐쉬에 존재해야 하며, Exclusie 모드로 소유해야 한다.
버퍼가 로컬캐쉬에 존재하지 않고, 다른 모드인 경우 발생
(만일 버퍼가 리모트 인스턴스에 존재하면, 버퍼는 로컬 캐쉬로 전송되고, 해당버퍼에 대한 EXCLUSIVE락이 부여된다.)
global cache null to s : 세션이 버퍼를 읽기 위해서는 해당 버퍼의 모드를 NULL모드에서 SHARED모드로 변경해야 한다.
만일 버퍼캐쉬에 존재하지 않을 경우 디스크에서 읽어 들이게 되고, 다른 인스턴스의 버퍼캐쉬에 존재하면
INTERCONNECT를 통해 전송된다.
global cache s to x : 세션이 SHARED모드로 소유하고 있는 버퍼를 EXCLUSIVE(X) 모드로 변경하려고 할때 대기한다.
만일 해당 버퍼를 SHARED 또는 EXCLUSIVE모드로 소유하고 있는 인스턴스가 없다면, 락은 즉시 EXCLUSIVE모드로
변경되고 global cache converts 성능지표의 수가 증가한다. 만일 해당 버퍼를 SHARED모드로
소유하고 있는 인스턴스가 있다면, 락 모드는 NULL모드로 변경된다.
global cache open x : 세션이 로컬 인스턴스에 존재하지 않는 current블록을 변경하려고 할 때 발생
CURRENT 블록은 리모트 인스턴스로부터 전송되거나 디스크로부터 읽어 들이게 된다.
만일 해당 블록이 어떠한 버퍼캐쉬에도 존재하지 않을 때, 락 변경은 발생하지 않는다
global cache open s : 세션이 버퍼캐쉬에 존재하는 블록을 처음으로 읽을 때 global cache open s 대기이벤트를 대기 한다.
인스턴스 스타트업 또는 로컬 버퍼캐쉬에서 첫번째로 블록을 읽는 동안 발생, 블록은 디스크로부터 적재되거나
다른 인스턴스로부터 전송된다.
row cache lock : 블록 레벨의 데이터를 관리하는 버퍼캐쉬와 달리, row 레벨로 데이터를 관리하는 dictionary cache를 row cache라고도 한다.
데이터 딕셔너리 오브젝트들의 정의를 보호하기 위한 락은 row cache lock이라고 부른다.
일반적으로 DDL 명령어는 orw cacahe lock이 필요하며, 데이터 딕셔너리 정보에 락을 설정하기 위해서 row cache lock을 대기 할 수 있다.
|