Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

dongdorodongdong

인덱스 본문

SQLD

인덱스

d5ngs 2019. 11. 28. 13:49
인덱스
  • 특징
    - 원하는 데이터를 쉽게 찾을 수 있도록 돕는 것 (책의 찾아보기와 유사)
    - 검색(조회) 성능의 최적화가 목표
    - 동일 컬럼으로 구성된 인덱스를 중복으로 생성X (컬럼의 순서가 다른 것은 서로 다른 인덱스로 취급)
    - 기본 인덱스에 중복된 키값, NULL 값 X
    - 자주 변경되지 않는 컬럼이 좋은 인덱스 후보
    - 테이블의 전체 데이터를 읽는 경우는 인덱스가 거의 불필요
    - 대량의 데이터를 삽입할 때는 모든 인덱스를 제거하고 데이터를 입력
    - 인덱스를 구성하는 컬럼의 순서는 성능에 영향을 줌
    - DML 처리 성능을 저하 시킬 수 있음
    - 인덱스를 구성하지 않는 컬럼의 데이터가 UPDATE될 때는 인덱스로 인한 부하가 발생하지 않음

  • 종류
    - 트리 기반 인덱스
    - 클러스터형 인덱스 (SQL Server)
     
트리 기반 인덱스
  • 특징
    - 양방향 링크를 가지고 있음 (오름차순, 내림차순 검색 가능)
    - 관계형 데이터베이스의 주요 인덱스 구조
    - '=', BETWEEN, '>' 와 같은 연산자로 검색하는 일치, 범위 검색에 적합

  • 구성
    Root Block
    > 브랜치 블록 중 가장 상위
    - Branch Block
    > 분기를 목적으로 하는 블록
    - Leaf Block
    > 트리의 가장 아래에 존재
    > 인덱스를 구성하는 컬럼의 데이터, 해당 데이터를 가지고 있는 행의 위치를 가리키는 레코드 식별자로 구성
    > 인덱스 데이터는 정렬이 되어 있음

  • 예시

    - 37을 찾는 경우
    1. Root Block 50보다 작으니, 왼쪽으로 분기
    2. 11과 40 사이에 있으니, 가운데로 분기
    3. 37을 바로 찾음

    - 37과 50사이의 값을 찾는 경우
    1. 위와 같은 방법으로 37을 찾음
    2. 오른쪽으로 이동하며 인덱스를 읽음


클러스터형 기반 인덱스

  • 특징
    - SQL Server의 인덱스
    - 인덱스의 Leaf Page가 곧 Data Page
    - Leaf Page에 인덱스 키 컬럼과 나머지 컬럼을 같이 저장하기 때문에 랜덤 엑세스 할 필요가 없음
    - Leaf Page를 탐색하면 해당 테이블의 모든 컬럼 값을 바로 얻을 수 있음
    - 클러스터형 인덱스는 테이블당 한개만 생성 가능
    - Oracle의 IOT와 매우 유사

BITMAP 인덱스

  • 정의
    - DW 및 AD-HOC 질의 환경(시스템에서 사용될 쿼리를 시스템 구현 시 모두 알 수 없는 경우)을 위해서 설계
    - 하나의 인덱스 키 엔트리가 많은 행에 대한 포인터를 저장하고 있는 구조


Full Table Scan

  • 특징
    - 테이블에 존재하는 모든 데이터를 읽어 조건에 맞으면 결과로 추출, 맞지 않으면 버리는 방식으로 검색
    - HWM 아래의 모든 블록을 읽음
    - 풀 테이블 스캔 방식으로 읽은 블록들은 메모리에서 바로 제거할 수 있도록 관리하기 때문에 재사용성이 떨어짐

    * HWM (High Water Mark)
    > 테이블에서 사용되었던 마지막 블록의 위치
    > 행이 삽입될 때 마다 이동하지만 행이 삭제될때에는 이동하지 않음
    > 풀 테이블 스캔 시 테이블의 마지막 블록을 인식하기 위해 사용

    * 옵티마이저가 Full Table Scan을 선택하는 이유
    > SQL문에 조건이 존재하지 않을 때
    > SQL문의 조건에 사용가능한 인덱스가 존재X
    > 테이블 내 조건을 만족하는 데이터가 많아서 옵티마이저가 테이블 전체를 읽어야 한다고 판단할 때
    > 병렬처리 방식으로 처리하는 경우


Index Scan
  • 특징
    - 인덱스를 구성하는 컬럼의 값을 기반으로 데이터를 추출
    - 인덱스의 Leaf Block은 인덱스를 구성하는 컬럼과 레코드 식별자로 구성
    - 인덱스에 존재하지 않는 컬럼의 값이 필요할 땐, 레코드 식별자로 테이블에 접근
    - 만약, SQL문에서 필요한 모든 컬럼이 인덱스 구성 컬럼에 포함된 경우에는 테이블을 엑세스X
    - 인덱스 컬럼들의 정렬이 반환에도 적용

  • 방식
    - 인덱스 유일 스캔
    - 인덱스 범위 스캔
    - 인덱스 역순 범위 스캔
    - 인덱스 전체 스캔
    - 인덱스 고속 전체 스캔
    - 인덱스 스킵 스캔

  • 인덱스 유일 스캔
    - Unique Index를 사용하여 단 하나의 데이터를 추출
    - 중복 허락X
    - Unique Index 구성 컬럼에 모두 '='로 값이 주어진 경우에만 가능한 스캔 방식

  • 인덱스 범위 스캔
    - 인덱스를 이용하여 한 건 이상의 데이터를 추출
    - Unique Index 구성 컬럼에 모두 '='로 값이 주어지지 않은 경우, Non-Unique Index를 이용하는
    모든 엑세스 방식에 가능한 스캔 방식

  • 인덱스 역순 범위 스캔
    - 인덱스의 Leaf Block의 양방향 링크를 이용하여 내림차순으로 데이터를 읽음
    - 최댓값을 쉽게 찾음

Full Table Scan VS Index Scan
  • 전체 테이블 스캔은 인덱스의 존재 유무에 상관없이 항상 이용 가능
    인덱스 스캔은 사용 가능한 인덱스가 존재하는 경우에만 이용 가능

  • 전체 테이블 스캔은 데이터를 읽을 때 한번의 I/O 요청으로 여러 블록을 한꺼번에 읽음
    인덱스 스캔은 한번의 I/O 요청에 한 블록씩 읽음 (대용량의 데이터 중 일부의 데이터를 찾을 때 효율이 좋음)


'SQLD' 카테고리의 다른 글

JOIN  (0) 2019.11.28
옵티마이저  (0) 2019.10.28
절차형 SQL  (0) 2019.10.25
DCL  (0) 2019.10.25
윈도우 함수  (0) 2019.10.25