대기가 데이타 블록에 있는 경우에는 데이타를 다른 블록으로 이동하여 이러한 핫 블록을 방지하거나, 테이블의 사용 가능 목록을 늘리거나, LMT(Locally Managed Tablespace)를 사용할 수 있습니다. 대기가 인덱스 블록에 있으면 인덱스를 다시 작성하거나, 인덱스를 분할하거나, 역방향 키 인덱스를 사용해야 합니다. 더 작은 블록 크기를 사용하여 데이타 블록과 관련된 버퍼 사용 중 대기를 방지할 수도 있습니다. 이 경우에는 단일 블록 내의 레코드 수가 줄어들기 때문에 “핫” 블록이 만들어지지 않습니다. DML(insert/update/ delete)이 발생하면 Oracle Database는 블록 상태에 “관계 있는” 모든 사용자(Interested Transaction List, ITL)를 포함한 정보를 블록에 기록합니다.
이 영역의 대기를 줄이려면 여러 ITL 슬롯을 허용하기 위해 블록에 공간을 만드는 initrans를 늘립니다. 또한 이 블록이 존재하는 테이블에서 pctfree를 늘릴 수도 있습니다. 이렇게 하면 지정된 initrans를 사용하여 작성한 슬롯이 충분하지 않을 경우, ITL 정보가 maxtrans에 의해 지정된 최대 수까지 기록됩니다.
Statspack에 대해 더 자세히 알아보려면
OTN에서 “Statspack을 통한 성능 조정”을 참조하십시오. otn.oracle.com/deploy/performance/pdf/ statspack_tuning_otn_new.pdf Rich Niemiec의 “Oracle Performance Tuning Tips and Techniques”을 Amazon.com에서 구입할 수 있습니다. |
매우 신속하게 획득 및 해제되는 메모리의 잠금과 유사한 기능을 가진 래치는 공유 메모리 구조에 대한 동시 액세스를 차단하는 데 사용됩니다. 래치를 사용할 수 없으면 사용 가능한 래치 실패가 기록됩니다.
대부분의 래치 문제는 바인드 변수(라이브러리 캐시 래치), 리두(redo) 생성 문제 (리두 할당 래치), 버퍼 캐시 경합 문제(캐시 버퍼 LRU 체인) 및 버퍼 캐시의 핫 블록(캐시 버퍼 체인) 사용이 실패하는 것과 관련됩니다.
또한 버그와 관련된 래치 대기가 존재할 수 있으므로 이러한 대기가 의심스러운 경우에는 MetaLink에서 버그 보고서를 검사합니다(oracle.com/support). 래치 실패 비율이 0.5%를 초과하면 문제점을 조사해야 합니다. 래치 대기는 별도의 항목으로 자세히 다룰 필요가 있습니다. 따라서 다음에 게시될 Oracle Magazine 칼럼에서 이에 대해 자세하게 설명할 것입니다.
일반적으로 대기열에 넣기 대기는 ST, HW, TX4 및 TM 대기열에 넣기를 가리킵니다. ST 대기열에 넣기는 딕셔너리 관리 테이블스페이스의 할당이나 공간 관리에 사용됩니다. 문제가 있는 딕셔너리 관리 테이블스페이스에 대해서는 LMT를 사용하거나, 확장 영역을 미리 할당하거나, 최소한 다음 확장 범위를 더 크게 만들어야 합니다. HW 대기열에 넣기는 고수위 세그먼트와 함께 사용되기 때문에 확장 범위를 수동으로 할당할 경우 이 대기를 우회할 수 있습니다. TX4는 가장 일반적인 대기열에 넣기 대기입니다. TX4 대기열에 넣기 대기는 일반적으로 세 가지 문제점 중 하나로 인해 발생합니다. 첫 번째 문제는 고유한 인덱스에 존재하는 중복된 값으로 인해 발생하는데, 이 경우에는 커밋/롤백을 실행하여 대기열에 넣기를 해제해야 합니다.
두 번째 문제는 동일한 비트맵 인덱스 부분을 여러 사용자가 동시에 업데이트할 때 발생합니다. 단일 비트맵 부분이 여러 ROWID를 포함할 수 있기 때문에 여러 사용자가 동일한 부분을 업데이트하려고 할 경우에는 커밋/롤백을 실행하여 대기열에 넣기를 해제해야 합니다. 가장 흔히 볼 수 있는 세번째 문제는 여러 사용자가 동일한 블록을 업데이트할 때 발생합니다. 이 경우에는 사용 가능한 ITL 슬롯이 없을 경우 블록 수준 잠금이 발생할 수 있습니다. 이 문제는 간단하게 방지할 수 있는데, initrans 및/또는 maxtrans를 늘려 여러 ITL 슬롯을 허용하거나 테이블에서 pctfree를 늘리면 됩니다.
마지막으로 TM 대기열에 넣기는 영향 받은 객체에 대한 DDL을 방지하기 위해 DML 도중에 발생합니다. 외래 키가 있는 경우에는 일반적으로 발생하는 이 잠금 문제를 방지하기 위해 외래 키를 인덱스해야 합니다.
8. 로그 파일 스위치(Log File Switch). 모든 커밋 요청은 “로그 파일 스위치(필요한 아카이브)” 또는 “로그 파일 스위치(불완전한 체크포인트)”를 기다립니다. 아카이브 디스크가 가득찼거나 속도가 느리지 않은지 확인해야 하며, DBWR은 I/O로 인해 너무 느릴 수 있습니다. 경우에 따라서는 더 크거나 많은 리두 로그를 추가해야 할 수 있고, DBWR이 문제인 경우에는 데이타베이스 기록자를 추가해야 할 수도 있습니다.
10. 휴지 이벤트(Idle Event). 출력 이후에 나열되는 여러 휴지 대기 이벤트가 존재하는데, 이러한 이벤트를 무시할 수 있습니다. 일반적으로 휴지 이벤트는 각 부분의 맨 아래에 나열되며, 이 이벤트에는 클라이언트에 대한 또는 클라이언트로부터의 SQL*Net 메시지나 다른 백그라운드 관련 타이밍 등이 포함됩니다. 휴지 이벤트는 stats$idle_event 테이블에 나열됩니다.
대기 문제 | 해결 방법 |
DB 파일 분산 읽기 | 여러 전체 테이블 스캔을 나타냄: 코드를 조정하고 작은 테이블을 캐싱합니다. |
DB 파일 순차 읽기 | 여러 인덱스 읽기를 나타냄: 코드(특히 조인)를 조정합니다. |
사용하지 않는 버퍼(Free Buffer) | DB_CACHE_SIZE를 늘리고, 체크포인트를 줄이고, 코드를 조정합니다.. |
사용 중인 버퍼 | 세그먼트 헤더: 사용 가능 목록 또는 사용 가능 목록 그룹을 추가합니다 |
사용 중인 버퍼 | 데이타 블록: initrans 및/또는 maxtrans를 늘립니다. |
사용 중인 버퍼 | 데이타 블록: “핫” 데이타를 분리하고 역방향 키 인덱스 및/또는 더 작은 블록을 사용합니다. |
사용 중인 버퍼 | 실행 취소 헤더: 롤백 세그먼트 또는 영역을 추가합니다. |
사용 중인 버퍼 | 실행 취소 블록: 더 자주 커밋을 실행하고 더 큰 롤백 세그먼트 또는 영역을 사용합니다. |
사용 가능한 래치 | 래치 세부 사항을 조사합니다. |
대기열에 넣기-ST | LMT를 사용하거나 큰 확장 영역을 미리 할당합니다. |
대기열에 넣기-HW | 최고 수위보다 높게 확장 영역을 미리 할당합니다. |
대기열에 넣기-TX4 | 테이블이나 인덱스에서 initrans 및/또는 maxtrans를 늘립니다. |
대기열에 넣기-TX4 | 외래 키를 인덱싱하고 테이블의 애플리케이션 잠금을 검사합니다. |
로그 버퍼 공간 | 로그 버퍼를 늘리고 더 빠른 디스크를 리두 로그에 사용합니다. |
로그 파일 스위치 | 아카이브 대상이 가득 찼거나 느리지 않은지 확인하고 더 크거나 많은 리두 로그를 추가합니다. |
로그 파일 동기화 | 한 번에 더 많은 레코드를 커밋하고 더 빠른 리두 로그 디스크나 원시 장치를 사용합니다 |
휴지 이벤트 | 이벤트를 무시합니다. |
이벤트 | 휴지 이벤트 유형 |
Dispatcher timer | 공유 서버 |
Lock manager wait for remote message | Oracle9i Real Application Clusters |
Pipe get | 사용자 프로세스 |
pmon timer | 백그라운드 프로세스 |
PX Idle wait | 병렬 질의 |
PX Deq Credit: need buffer | 병렬 질의 |
PX Deq Credit: send blkd | 병렬 질의 |
rdbms ipc message | 백그라운드 프로세스 |
smon timer | 백그라운드 프로세스 |
SQL*Net message from client | 사용자 프로세스 |
virtual Circuit status | 공유 서버 |