ORA-01793: 지정 가능한 인덱스 열의 최대수는 32 입니다. (ORA-01793: maximum number of index columns is 32)

ORA-01793: maximum number of index columns is 32 오류는 오라클에서 발생하는 제약 조건 중 하나예요. 인덱스를 생성하거나 수정할 때 컬럼을 너무 많이 포함시키면 나타나요. 오라클에서는 한 인덱스에 포함할 수 있는 컬럼의 최대 개수를 32개로 제한해요.

원인

  • 하나의 인덱스에 33개 이상의 컬럼을 포함하려고 시도하는 경우 발생
  • 자동으로 생성되는 인덱스(예: 제약조건 PK, UK 생성 시)도 컬럼이 너무 많으면 동일한 오류 발생
  • 복합 인덱스를 설계하면서 모든 컬럼을 처리하려는 시도 때에 자주 발생

컬럼 개수 줄이기

가장 기본적인 방법이에요. 인덱스에 꼭 필요한 컬럼만 남기고, 나머지는 빼는 방법입니다~ 모든 컬럼을 넣는다고 해서 성능이 좋아지는 게 아니에요. 오히려 불필요한 인덱스는 쿼리 최적화에 방해만 한답니다.

인덱스를 분리하기

'한 방에 다 해결하는 인덱스'는 현실적으로 불가능해요. 주요 검색 조건이나 자주 사용하는 조합을 기준으로 인덱스를 나누면 더 효율적이에요. 여러 개의 인덱스를 상황에 맞게 활용하는 편이 훨씬 안정적이에요.

데이터 모델 재검토

사실 인덱스에 컬럼을 32개 넘게 넣겠어? 하고 오라클에서 만든 예외가 아닐까 해요. 테이블 설계가 지나치게 복잡하거나, 쿼리 로직이 비효율적일 가능성이 높으니 살펴보세요! 데이터 모델을 재검토하고 방식을 최적화하는 게 가장 근본적인 해결책이에요.

기타

비트맵 인덱스(bitmap index) => 인덱스 고려 컬럼의 카디널리티가 낮은 경우(값의 고유성이 낮은 경우, 중복도가 높은 경우) 예를 들면, 이분법적 성별(남성, 여성), 삼원색(Red, Green, Blue)와 같은 컬럼. 다만, DML이 많은 환경에서는 오히려 성능 저하가 생길 수 있으니 상황을 잘 보고 선택해야 해요.

함수 기반 인덱스(function based index) => 특정 패턴의 검색이나 조건을 위해 많은 컬럼을 넣는 대신, 계산된 결과에 인덱스를 적용하는 방법이에요. 예를 들어, 여러 컬럼을 합쳐 비교해야 한다면 함수 기반 인덱스로 깔끔하게 해결할 수 있어요. 비트맵과 마찬가지로 DML이 많으면 성능 저하가 생길 수 있어요.

이전최근
댓글 쓰기
가져가실 때, 출처 표시 부탁드려요! 감사합니다. 💗