본문 바로가기

IT/Oracle

오라클 인덱스 생성시 NOWAIT 옵션

300x250

Oracle에서 인덱스를 생성할 때 NOWAIT 옵션을 사용하면, 잠금 대기 없이 즉시 인덱스를 생성하거나, 잠금이 발생할 경우 에러를 반환합니다.

사용법

CREATE INDEX index_name 
ON table_name (column1, column2, ...)
NOWAIT;

 

기본 동작
  • NOWAIT 없이 실행하면, 대상 테이블이 다른 트랜잭션에 의해 잠겨 있는 경우 인덱스 생성이 잠금 해제될 때까지 대기합니다.
  • NOWAIT를 사용하면, 테이블이 잠겨 있는 경우 즉시 에러를 반환합니다.

에러 메시지
  • NOWAIT를 사용할 때 테이블이 잠겨 있는 경우 다음과 같은 에러가 발생할 수 있습니다:
  • ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired
  • 이는 해당 테이블이 다른 트랜잭션에 의해 잠금 상태임을 나타냅니다.

★ 예제
1. 일반적인 인덱스 생성
  • 테이블 employees가 잠겨 있지 않으면 인덱스가 생성됩니다.
  • 잠겨 있으면 ORA-00054 에러가 반환됩니다.

CREATE INDEX idx_emp_name 
ON employees (last_name, first_name)
NOWAIT;


2. 복합 인덱스 생성

CREATE INDEX idx_sales_date 
ON sales (region_id, sale_date)
NOWAIT;

NOWAIT 사용 시 주의사항
1. 대상 테이블이 잠길 가능성이 높은 경우
  • 테이블이 다른 트랜잭션에서 사용 중이라면 인덱스 생성이 실패할 수 있습니다.
  • NOWAIT를 사용할 때, 실행 전 테이블에 잠금이 걸리지 않도록 관리해야 합니다.
2. 대안 - ONLINE 옵션
  • Oracle 12c 이상에서는 ONLINE 옵션을 사용해 테이블 잠금을 피할 수 있습니다.

CREATE INDEX index_name
ON table_name (column_name)
ONLINE;
300x250