SQL 인덱스 관리: 두 판 사이의 차이

IT 위키
(새 문서: SQL 인덱스 관리(SQL Index Management, 索引管理)은 관계형 데이터베이스에서 인덱스를 생성, 유지, 최적화하여 질의 성능을 향상시키는 작업을 의미한다. ==개요== 인덱스는 데이터베이스 테이블에서 특정 컬럼의 값을 기반으로 검색 속도를 향상시키기 위한 자료 구조이다. 인덱스를 적절히 관리하면 데이터 검색 시간이 대폭 단축되며, 부적절한 인덱스는 오히려 성능...)
 
(차이 없음)

2025년 4월 20일 (일) 00:53 기준 최신판

SQL 인덱스 관리(SQL Index Management, 索引管理)은 관계형 데이터베이스에서 인덱스를 생성, 유지, 최적화하여 질의 성능을 향상시키는 작업을 의미한다.

개요[편집 | 원본 편집]

인덱스는 데이터베이스 테이블에서 특정 컬럼의 값을 기반으로 검색 속도를 향상시키기 위한 자료 구조이다. 인덱스를 적절히 관리하면 데이터 검색 시간이 대폭 단축되며, 부적절한 인덱스는 오히려 성능 저하의 원인이 될 수 있다.

인덱스의 종류[편집 | 원본 편집]

  • 기본 인덱스(Primary Index)
  • 보조 인덱스(Secondary Index)
  • 고유 인덱스(Unique Index)
  • 복합 인덱스(Composite Index)
  • 함수 기반 인덱스(Function-based Index)
  • 비트맵 인덱스(Bitmap Index)

인덱스 생성[편집 | 원본 편집]

인덱스는 일반적으로 CREATE INDEX 문을 사용하여 생성하며, 다음과 같은 방식으로 정의할 수 있다.

CREATE INDEX idx_employee_name ON employees(name);

복합 인덱스는 다음과 같이 생성할 수 있다.

CREATE INDEX idx_employee_dept_salary ON employees(department_id, salary);

고유 인덱스는 중복값을 허용하지 않는 인덱스로 다음과 같이 생성한다.

CREATE UNIQUE INDEX idx_employee_email ON employees(email);

인덱스 관리 전략[편집 | 원본 편집]

  • 사용률 분석: 잘 사용되지 않는 인덱스는 제거하여 저장 공간을 절약하고 DML 성능을 향상시킨다.
  • 정기적 재구성(Rebuild): 데이터 변경이 많을 경우 인덱스의 조각화(fragmentation)를 줄이기 위해 재구성이 필요하다.
  • 통계 정보 갱신: 옵티마이저가 최적의 실행 계획을 수립할 수 있도록 주기적으로 인덱스 통계 정보를 갱신한다.
  • 자동 인덱스 관리: 일부 DBMS는 자동으로 인덱스를 생성·제거하는 기능을 제공한다(예: Oracle의 Automatic Indexing).
  • 인덱스 조건 최적화: WHERE 절과 자주 결합되는 컬럼 중심으로 인덱스를 구성한다.

인덱스 사용 모니터링[편집 | 원본 편집]

  • 실행 계획(EXPLAIN 또는 EXPLAIN PLAN)을 통해 쿼리가 인덱스를 사용하는지 확인 가능
 예:
 EXPLAIN SELECT * FROM employees WHERE name = '김철수';
  • 쿼리 성능 도구(SQL Server Profiler, Oracle AWR 등)로 인덱스 활용도 측정
  • DMVs(Dynamic Management Views)나 시스템 뷰를 통해 인덱스 통계 확인
 예:
 SELECT * FROM sys.dm_db_index_usage_stats WHERE object_id = OBJECT_ID('employees');

인덱스 제거[편집 | 원본 편집]

불필요한 인덱스는 DROP INDEX 문을 사용하여 제거할 수 있으며, 다음과 같은 경우 인덱스를 제거한다.

  • 조회 빈도가 낮고 DML 작업이 많은 경우
  • 다른 인덱스와 기능이 중복되는 경우
  • 성능 모니터링 결과 비용만 증가시키는 경우

예: DROP INDEX idx_employee_name ON employees;

인덱스가 사용되는 쿼리 예시[편집 | 원본 편집]

  • 단일 컬럼 인덱스를 활용한 예
 SELECT * FROM employees WHERE name = '홍길동';
  • 복합 인덱스를 활용한 예
 SELECT * FROM employees WHERE department_id = 10 AND salary > 5000;
  • LIKE 연산에 대한 인덱스 사용 (전방 일치의 경우에만)
 SELECT * FROM employees WHERE name LIKE '김%';
  • 함수 기반 인덱스가 필요한 예
 SELECT * FROM employees WHERE UPPER(name) = '홍길동';
 -- 위 쿼리는 일반 인덱스를 사용하지 못하므로, 다음과 같이 인덱스를 생성해야 한다.
 CREATE INDEX idx_upper_name ON employees(UPPER(name));

주의사항[편집 | 원본 편집]

  • 너무 많은 인덱스는 삽입, 갱신, 삭제 시 부하를 증가시킨다.
  • 넓은 범위를 조회하는 쿼리에는 인덱스 효율이 낮을 수 있다.
  • 함수나 연산이 적용된 컬럼에는 일반 인덱스가 작동하지 않을 수 있다.

같이 보기[편집 | 원본 편집]

참고 문헌[편집 | 원본 편집]

  • Surajit Chaudhuri and Gerhard Weikum, "Rethinking Database System Architecture: Towards a Self-tuning RISC-style Database System", VLDB, 2000.
  • Thomas Connolly and Carolyn Begg, *Database Systems: A Practical Approach to Design, Implementation, and Management*, Pearson.

각주[편집 | 원본 편집]