도메인 인덱스 사용 시기

도메인 인덱스란 무엇인가?

Oracle 데이터베이스에서 도메인 인덱스(Domain Index)는 특정 애플리케이션 또는 사용자 정의 데이터 타입(ADT, Abstract Data Type)에 특화된 인덱스입니다. 표준적인 B-트리 인덱스가 모든 데이터 타입에 최적화되어 있지 않기 때문에, 특수한 자료 구조나 접근 방식을 요구하는 데이터 타입에 대해 성능을 개선하기 위해 사용됩니다.

도메인 인덱스 사용 시점

도메인 인덱스는 다음과 같은 상황에서 유용합니다.

  • 사용자 정의 데이터 타입(ADT) 기반 검색: 이미지, 공간 정보, 텍스트 문서 등과 같이 Oracle에서 기본적으로 제공하지 않는 복잡한 데이터 타입을 사용하는 경우, 해당 타입에 맞는 특화된 인덱스가 필요합니다.
  • 특정 애플리케이션 요구 사항: 애플리케이션이 특정 방식으로 데이터를 검색하고, 이 방식이 표준 인덱스를 사용하는 것보다 훨씬 효율적인 경우, 도메인 인덱스를 사용하여 성능을 극대화할 수 있습니다.
  • 데이터 분포 및 특성 활용: 데이터의 분포나 특성이 일반적인 인덱스 전략에 적합하지 않을 때, 도메인 인덱스를 통해 더욱 효과적인 검색 경로를 제공할 수 있습니다.

도메인 인덱스 생성 및 활용 예시

1. 공간 데이터 인덱싱

Oracle Spatial and Graph에서 공간 데이터를 효율적으로 관리하기 위해 도메인 인덱스를 사용합니다. 다음은 공간 데이터 타입인 SDO_GEOMETRY를 사용하는 테이블에 공간 인덱스를 생성하는 예시입니다.


CREATE INDEX SPATIAL_IDX ON LOCATIONS(GEOM) INDEXTYPE IS MDSYS.SPATIAL_INDEX;
  

여기서 LOCATIONS 테이블의 GEOM 컬럼은 공간 데이터를 저장하며, MDSYS.SPATIAL_INDEX는 Oracle Spatial에서 제공하는 공간 인덱스 타입입니다. 이 인덱스를 사용하면 공간 질의(예: 특정 영역 내의 위치 찾기) 성능이 크게 향상됩니다.

2. 텍스트 데이터 인덱싱

Oracle Text를 사용하면 텍스트 데이터를 효율적으로 검색할 수 있습니다. 다음은 텍스트 데이터 타입인 CLOB를 사용하는 테이블에 텍스트 인덱스를 생성하는 예시입니다.


CREATE INDEX TEXT_IDX ON ARTICLES(CONTENT) INDEXTYPE IS CTXSYS.CONTEXT;
  

ARTICLES 테이블의 CONTENT 컬럼은 텍스트 데이터를 저장하며, CTXSYS.CONTEXT는 Oracle Text에서 제공하는 텍스트 인덱스 타입입니다. 이 인덱스를 사용하면 텍스트 검색 질의(예: 특정 키워드가 포함된 기사 찾기) 성능이 크게 향상됩니다.

3. 사용자 정의 데이터 타입(ADT) 인덱싱

사용자 정의 데이터 타입에 대한 인덱스를 생성할 때도 도메인 인덱스를 활용할 수 있습니다. 예를 들어, IP 주소를 저장하는 사용자 정의 데이터 타입에 대한 인덱스를 생성하는 경우를 생각해 볼 수 있습니다.


CREATE TYPE IP_ADDRESS AS OBJECT (
  PART1 NUMBER,
  PART2 NUMBER,
  PART3 NUMBER,
  PART4 NUMBER
);
/

CREATE TABLE NETWORK_LOGS (
  LOG_ID NUMBER PRIMARY KEY,
  IP IP_ADDRESS
);

CREATE INDEX IP_IDX ON NETWORK_LOGS(IP) INDEXTYPE IS ...; -- 사용자 정의 인덱스 타입
  

위 예시에서 IP_ADDRESS는 사용자 정의 데이터 타입이며, NETWORK_LOGS 테이블은 이 타입을 사용하는 IP 컬럼을 가집니다. CREATE INDEX 구문에서 INDEXTYPE IS ... 부분은 실제 사용자 정의 인덱스 타입을 지정해야 합니다. 이 인덱스를 사용하면 IP 주소 기반 검색 성능을 최적화할 수 있습니다. 사용자 정의 데이터 타입 기반 검색을 위해 도메인 인덱스를 생성하는 방법은 복잡하므로, 사용자 정의 인덱스 타입 구현에 대한 깊이 있는 이해가 필요합니다.

실행 결과 확인

실제로 도메인 인덱스를 생성하고 활용하는 쿼리의 실행 계획을 확인하여 성능 개선 효과를 검증할 수 있습니다. EXPLAIN PLAN 명령을 사용하여 실행 계획을 확인하고, 인덱스 사용 여부를 분석합니다.


EXPLAIN PLAN FOR
SELECT ... FROM LOCATIONS WHERE SDO_WITHIN_DISTANCE(GEOM, SDO_GEOMETRY(...), 'distance=10 unit=km') = 'TRUE';

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
  

실행 계획에서 공간 인덱스(SPATIAL_IDX)가 사용되었는지 확인하여 성능 개선 여부를 판단할 수 있습니다. 텍스트 인덱스의 경우도 마찬가지로 실행 계획을 통해 CTXSYS.CONTEXT 인덱스 사용 여부를 확인합니다.

주의사항

도메인 인덱스를 사용할 때 다음 사항에 유의해야 합니다.

  • 적절한 인덱스 타입 선택: 데이터 타입과 검색 패턴에 맞는 최적의 인덱스 타입을 선택해야 합니다.
  • 유지 관리 비용 고려: 도메인 인덱스는 표준 인덱스보다 유지 관리 비용이 높을 수 있으므로, 성능 개선 효과와 비용 간의 균형을 고려해야 합니다.
  • 사용자 정의 인덱스 타입 구현 복잡성: 사용자 정의 인덱스 타입을 직접 구현하는 것은 상당한 기술적 난이도를 요구하므로, 신중하게 접근해야 합니다.

결론

도메인 인덱스는 Oracle 데이터베이스에서 사용자 정의 데이터 타입과 애플리케이션에 특화된 검색 성능을 최적화하는 강력한 도구입니다. 적절한 사용 시점을 파악하고, 데이터 타입과 검색 패턴에 맞는 인덱스 타입을 선택하면, 애플리케이션의 전체적인 성능을 크게 향상시킬 수 있습니다. 다만, 구현 복잡성과 유지 관리 비용을 고려하여 신중하게 적용해야 합니다.

위로 스크롤