2026년 07월 19일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-01491 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-01491 CLUSTER option not valid for this index 는?
ORA-01491 에러는 Oracle 데이터베이스에서 인덱스를 생성하거나 수정할 때 CLUSTER 옵션을 지원하지 않는 인덱스 유형에 해당 옵션을 사용하려 할 때 발생하는 오류입니다. 즉, CLUSTER 절은 클러스터 테이블(Clustered Table)에 정의된 인덱스에만 유효하며, 일반 힙(Heap) 테이블 또는 특수 인덱스 유형(비트맵 인덱스, 함수 기반 인덱스 등)에는 적용할 수 없습니다. DBA나 개발자가 DDL 스크립트를 재사용하거나 다른 환경에서 복사해 올 때 이 에러가 빈번하게 나타나며, 특히 자동화된 배포 파이프라인에서 예상치 못한 장애를 유발할 수 있습니다.
주요 발생 원인
1. 클러스터 테이블이 아닌 일반 테이블에 CLUSTER 인덱스 옵션 사용
가장 흔한 원인으로, 개발자가 클러스터 환경에서 사용하던 DDL 스크립트를 일반 힙 테이블에 그대로 적용할 때 발생합니다. Oracle에서 CLUSTER 키워드를 인덱스 생성 시 사용하려면 반드시 해당 테이블이 CREATE CLUSTER 명령으로 생성된 클러스터에 속해 있어야 합니다. 아무리 테이블 구조가 동일하더라도 일반 테이블이라면 이 옵션은 허용되지 않습니다.
2. 클러스터 인덱스를 비트맵 인덱스나 함수 기반 인덱스로 생성 시도
비트맵(Bitmap) 인덱스나 함수 기반(Function-Based) 인덱스는 CLUSTER 옵션과 함께 사용할 수 없는 제약이 있습니다. 이는 Oracle 내부 아키텍처 상 클러스터 인덱스는 B-Tree 방식만 지원하기 때문입니다. 이러한 제약을 인지하지 못하고 혼합된 옵션을 사용하면 ORA-01491이 발생합니다.
3. 클러스터 인덱스 재생성 시 구문 오류 또는 잘못된 클러스터 지정
기존 클러스터 인덱스를 DROP 후 재생성할 때 클러스터 이름을 잘못 지정하거나, 해당 클러스터가 이미 삭제된 상태에서 인덱스를 생성하려는 경우에도 이 에러가 발생할 수 있습니다. 클러스터와 연결된 테이블, 인덱스의 의존 관계를 정확히 파악하지 못하면 DBA조차 실수하기 쉬운 케이스입니다.
해결 방법
원인 1 해결: 일반 테이블에는 CLUSTER 옵션 제거
일반 테이블에 인덱스를 생성할 때는 CLUSTER 옵션 없이 표준 CREATE INDEX 문을 사용해야 합니다.
-- 잘못된 예시 (ORA-01491 발생)
CREATE INDEX idx_emp_deptno
ON emp(deptno)
CLUSTER emp_cluster; -- 일반 테이블에는 사용 불가
-- 올바른 예시 (일반 테이블)
CREATE INDEX idx_emp_deptno
ON emp(deptno)
TABLESPACE users;
클러스터 테이블인지 확인하려면 아래 쿼리를 사용하세요.
-- 테이블이 클러스터에 속하는지 확인
SELECT table_name, cluster_name
FROM user_tables
WHERE table_name = 'EMP';
-- CLUSTER_NAME이 NULL이면 일반 테이블
원인 2 해결: 클러스터에는 B-Tree 인덱스만 사용
클러스터 테이블에는 반드시 B-Tree 인덱스를 사용해야 합니다. 비트맵 인덱스가 필요한 경우 클러스터 구성을 재검토해야 합니다.
-- 클러스터 생성 예시
CREATE CLUSTER emp_dept_cluster (deptno NUMBER(2))
SIZE 512
TABLESPACE users;
-- 클러스터 테이블 생성
CREATE TABLE emp_cluster_tbl (
empno NUMBER(4),
ename VARCHAR2(10),
deptno NUMBER(2)
)
CLUSTER emp_dept_cluster (deptno);
-- 올바른 클러스터 인덱스 생성 (B-Tree만 가능)
CREATE INDEX idx_emp_dept_cluster
ON CLUSTER emp_dept_cluster
TABLESPACE users;
-- 잘못된 예시: 비트맵 인덱스 시도 (에러 발생)
-- CREATE BITMAP INDEX idx_emp_dept_bitmap
-- ON CLUSTER emp_dept_cluster; -- ORA-01491 유발 가능
원인 3 해결: 클러스터 유효성 확인 후 인덱스 재생성
인덱스를 재생성하기 전에 반드시 클러스터 객체가 존재하는지 확인하세요.
-- 현재 사용자 클러스터 목록 확인
SELECT cluster_name, cluster_type, tablespace_name
FROM user_clusters;
-- 클러스터에 속한 테이블 확인
SELECT table_name, cluster_name
FROM user_tables
WHERE cluster_name IS NOT NULL;
-- 클러스터 인덱스 존재 여부 확인
SELECT index_name, index_type, table_name, status
FROM user_indexes
WHERE index_type = 'CLUSTER';
-- 클러스터 인덱스 삭제 후 재생성 절차
DROP INDEX idx_emp_dept_cluster;
CREATE INDEX idx_emp_dept_cluster
ON CLUSTER emp_dept_cluster
TABLESPACE users
PARALLEL 2;
-- 인덱스 생성 후 상태 확인
SELECT index_name, status
FROM user_indexes
WHERE index_name = 'IDX_EMP_DEPT_CLUSTER';
예방 방법
1. DDL 스크립트 이관 시 테이블 유형 사전 검증 자동화
다른 환경(개발→운영, 구 시스템→신규 시스템)으로 DDL 스크립트를 이관할 때는 반드시 사전에 테이블 유형(일반 힙 vs. 클러스터)을 확인하는 검증 스크립트를 CI/CD 파이프라인에 포함시키세요. 아래와 같은 스크립트를 배포 전 단계에 삽입하면 불필요한 에러를 사전에 차단할 수 있습니다.
-- 배포 전 클러스터 테이블 목록 자동 검증 쿼리
SELECT t.table_name,
t.cluster_name,
CASE
WHEN t.cluster_name IS NOT NULL THEN 'CLUSTER TABLE'
ELSE 'HEAP TABLE'
END AS table_type
FROM user_tables t
ORDER BY table_type, table_name;
2. Oracle 클러스터 사용 여부 설계 단계에서 명확히 결정
Oracle 클러스터(Cluster)는 특정 상황(같은 컬럼으로 자주 조인되는 테이블)에서만 성능 이점이 있으며, 잘못 사용하면 오히려 성능 저하를 유발할 수 있습니다. 설계 단계에서 클러스터 사용 여부를 명확히 문서화하고, 클러스터 관련 DDL은 별도 템플릿을 유지 관리하여 일반 테이블용 DDL과 혼용되지 않도록 관리 체계를 구축하는 것이 중요합니다.
관련 에러
- ORA-00902: 유효하지 않은 데이터 타입 — 클러스터 컬럼 타입 불일치 시 발생
- ORA-01499: 테이블/인덱스가 클러스터에 속하지 않을 때 발생하는 관련 에러
- ORA-00604: 내부 재귀 SQL 에러 — 클러스터 메타데이터 손상 시 동반 발생 가능
- ORA-01501: CREATE DATABASE 구문 오류 — 클러스터 생성 구문과 혼동될 수 있음
- ORA-00942: 테이블 또는 뷰가 존재하지 않음 — 클러스터에 연결된 테이블 부재 시 발생
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.