SWExpert 2022. 10. 25. 23:19

I. 인덱스

-. 데이터베이스의 검색 속도 향상을 위해 레코드 키값, 레코드 주소 쌍을 체계적으로 수집하여 관리하는 보조 데이터 도구

-. 특징: 조회성능향상, 독립성, 알고리즘, 성능

특징 설명
조회 성능향상
(Query Performance)
- 데이터베이스 테이블에 접근하는 트랜잭션의 성능 향상이 목적임 
- 인덱스의 생성에 대한 시스템 부하 고려

- 별도의 인덱스를 위한 저장 공간 고려
독립성
(Independence)
- 테이블에 저장구조와 별도로 인덱스만 저장할 수 있음

- 독립적 인덱스 저장구조
알고리즘
(Algorithm)
- Tree 구조, Hash 함수 등 적용, 알고리즘을 적용하여 생성 
- 데이터의 저장 형태에 따른 알고리즘 고려 필요
성능
(trade-off)
- 조회 vs 입력/수정/삭제성능을 고려하여 인덱스 생성요구 
- 조회 성능 향상이 주목적,입력/수정/삭제 성능은 저하됨

- 인덱스의 필요성

관점 필요성 설명
개발/운용자 개발생산성 향상 응용시스템 개발 속도 증가
유지보수 비용절감 장기적 관점 비용절감 효과
사용자 응답속도 향상 조회 성능의 향상(수행속도)
고객만족도 개선 고객만족도 향상
시스템 가용성 향상 사용 요구에 대한 적시 사용 지원
신뢰성 증진 요구기능에 대한 정확한 응답

II. 인덱스 기본 구조

가. 인덱스에서 원하는 값 찾는 과정

  • 1단계. 브랜치 블록의 가장 왼쪽 값이 찾고자 하는 값보다 작거나 같으면 왼쪽 포인터로 이동 
  • 2단계. 찾고자 하는 값이 브랜치 블록의 값 사이에 존재하면 가운데 포인터로 이동
  • 3단계. 오른쪽에 있는 값보다 크면 오른쪽 포인터로 이동

나. 인덱스의 스캔방식

스캔방식 특징 설명
Index Range Scan - 수직적 탐색
- 범위(Range) 스캔
- 테이블 액세스 횟수
- 선두컬럼이 조건절에 사용
- Index Range Scan Ascending
- Index Range Scan Descending
- 인덱스를 이용하여 한 건 이상의 데이터를 추출하는 방식

Index Full Scan - 리프 블록을 처음부터 끝까 지 수평적 탐색
- 최적인덱스없을시선택 
- 소트연산대체
- 일부에 대해서만 테이블 액세스 발생 시 Table Full Scan 보다 Index Full Scan 방식 적용 

Index Unique Scan - Unique Index

- 중복허용 불가

- =’조건으로 탐색

- 검색결과 최대 1
- 수직적 탐색
- Unique Index를 사용하여 단 하나의 데이터를 추출하는 방식
Index Skip Scan - Distinct Value 개수가 적은 경우
- 후행 컬럼의 Distinct Value개 수가 많을 경우 유용
- 루트 또는브랜치 블록에서 읽은 컬럼 값 정보 이용해 부합하는 레코드를 포함할 “가능성 있 는” 하위블록만 골라서 액세스하는 방식
Index Fast Full Scan - 세그먼트 전체 스캔
- 결과집합 순서 보장 안됨
- Multiblock I/O
- 병렬스캔 가능
- 인덱스에 포함된 컬럼만으로만 조회할 때 사용 가능 
- Index Full Scan 보다 빠름

- 인덱스 트리 구조를 무시하고 세그먼트 전체를 Multiblock Read 방식으로 스캔
Index Range Scan Descending - 내림차순 정렬 결과집합
- Max값 쉽게 찾음

- Index Range Scan의 일종
- Index Range Scan과 기본적으로 동일한 스캔방 식으로 인덱스를 뒤에서부터 앞쪽으로 스캔

 

III. 인덱스 유형 및 구조

가. 인덱스 분류

나. 인덱스 분류별 구조

구분 인덱스 구조 설명
형태 트리 기반 인덱스 - 인덱스 (RDBMS 는 대부분 B tree)
해쉬 기반 인덱스 - Hash 테이블 을 이용하여 데이터 검색(=, <=, => 연산자만 사용 가능)
비트맵 인덱스 - 컴퓨터에서 사용하는 최소 단위인 비트를 이용하여 컬럼값을 저장하고 이를 이용하여 ROWID를 자동으로 생성하는 인덱스
목적 함수기반 인덱스 - 사용자 정의 함수 결과를 인덱스로 사용
- 데이터 타입이 상이한 컬럼 간 사용
조인 인덱스 - DW 에서 조인 쿼리의 처리가 가능
도메인 인덱스 - 사용자 정의의 인덱스 타입을 사용
- 텍스트 , 카테고리 인덱스 등
구조 정적 인덱스 - 데이터 파일에 레코드가 삽입되거나 삭제됨에 따라 인덱스의 내용은 변하지만 인덱스 구조 자체는 변경되지 않게 하는 인덱싱 기법
동적 인덱스 - 인덱스와 데이터 파일을 블록으로 구성하고 , 각 블록에는 나중에 레코드가 삽입될 것을 감안하여 빈 공간을 미리 준비해두는 인덱싱 기법
논리 논리적 인덱스 - 인덱스가 생성될 때 컬럼의 속성과 유형에 따라 분리
물리적 인덱스 - 인덱스가 저장되는 데이터 구조에 따라 나누어지는 방법

다. 인덱스 유형

구분 유형 설명
물리적 인덱스 B* Tree Index - 빈번한 노드의 분열을 줄이고자 하는 것으로 모든 키와 그에 관련된 레코드들 이 잎 노드에 존재하며,B 트리 인덱스로 검색되는 자료 구조
비트맵 인덱스
(Bitmap Index)
- Bit로 맵을 만드는 인덱스(칼럼기반의 DBMS)

- Cardinality(한 릴레이션을 구성하는 투플의 수)의 개수로 맵을 만듦
Reverse Key Index - Skew 현상 최소화를 위해 Index Key값의 Byte를 반대로 배열해 B*Tree 구조로 저장
Descending Index - 일반적인 인덱스는 기본적으로 오름차순이나 내림차순으로 데이터 정렬 가능
분할 인덱스
(Partition Index)
- 큰 테이블의 인덱스 엔트리를 저장하는데 사용
- 인덱스까지 화일별 다르게 저장 -> 대용량 테이블에서만 효과

- 인덱스 값에 따라 여러 세그먼트에 나누어 보관
논리적 인덱스 Clustered Index - 데이터 레코드의 논리적/물리적 순서가 동일한 인덱스. (고속조회가 가능)
Non-Clustered Index - 데이터 레코드의 논리적/물리적 순서가 상관없이 저장되는 인덱스
Dense Index - 데이터 레코드 단위로 하나의 인덱스 엔트리가 만들어지는 인덱스
Sparse Index - 데이터 파일의 데이터 블록단위로 엔트리가 만들어지는 인덱스
Unique Index - 기본키와 고유키 제약조건을 정의하면 인덱스가 묵시적으로 생성(중복불가)
Non-Unique Index - 인덱스 키는 연관된 테이블의 여러 행을 가리킬 수 있음(중복허용)
Single Index - 하나의 컬럼으로 구성된 인덱스
Composite Index - 여러 개의 컬럼 조합으로 생성된 인덱스

- 조합 인덱스는 최대 32개의 컬럼까지 구성가능
Function-based Index - 함수나 표현식의 계산 값으로 인덱스 생성
- 함수의 리턴 값은 DETERMINISTICS로 선언되어야 함

- Cost-based에서만 사용 가능함

 

IV. 인덱스 선정절차 및 사용 장단점

가. 인덱스 선정절차

절차 설명
1. 테이블의 액세스 형태를 최대한 수집
  • 해당 테이블에 대한 액세스 형태를 수집
  • 개발 단계에서도 가능한 실제 데이터량에 버금가는 데이터 생성
2. 인덱스 대상 컬럼의 선정 및 분포도 조사
  • 인덱스 대상 컬럼의 선정
  • 선정된 컬럼들의 분포도조사
3. 특수한 액세스 형태에 대한 인덱스 선정
  • 항상 사용되는 컬럼을 최대한 선행 배치
4. 클러스터링 검토
  • 넓은 범위의 데이터가 자주 액세스 되는 경우, 클러스터링 구성
5. 결합 인덱스 구성 및 순서의 결정
  • 자주 사용되는 컬럼을 조합하여 더 나은 성능을 낼 수 있도록 구성
6. 시험 생성 및 테스트
  • 정확한 테스트를 위해 오브젝트 파라미터(Object Parameter) 확정
  • 실행계획을 확인할 수 있는 도구 활용
7. 수정이 필요한 어플리케이션 조사 및 선정
  • 특정한 액세스 경로로 유도하기 위한 HINT 사용
  • 어플리케이션 특성에 따라 인덱스 사용 제한, 또는 해제를 고려
8. 일괄 적용
  • 적용 후 실행계획 모니터링, 지속적 개선(SQL 수정 및 인덱스 변경)

나. 인덱스 사용 장단점

구분 설명
장점 검색 성능 최적화 :
FTS(Full Table Scan)에 비해 물리적 디스크 I/O 적음, 별도의 정렬 없이 인덱스 순서대로 결과 추출 가능
단점
  • 추가 용량 필요 : 데이터베이스 내 약 10% 내외의 공간이 추가로 필요
  • 성능 저하 발생 가능 : insert, update, delete 등 DML 작업이 잦은 경우, 성능이 느려짐