인덱스

SQL Server에서 쿼리 성능 향상하기

Dean Smith

Founder, Atamai Analytics

인덱스란?

  • 테이블 데이터 접근 속도를 높이는 구조
  • 전체 테이블 스캔 없이 빠르게 데이터 찾기
  • 조건 필터가 있는 쿼리 성능 향상
  • 테이블 열에 적용
  • 보통 데이터베이스 관리자(DBA)가 추가
SQL Server에서 쿼리 성능 향상하기

클러스터형 vs 비클러스터형 인덱스

클러스터형 인덱스

  • 비유: 사전
  • 인덱스 열 기준으로 테이블 데이터 페이지 정렬
  • 테이블당 1개만 가능
  • 검색 속도 향상
SQL Server에서 쿼리 성능 향상하기

클러스터형 vs 비클러스터형 인덱스

클러스터형 인덱스

  • 비유: 사전
  • 인덱스 열 기준으로 테이블 데이터 페이지 정렬
  • 테이블당 1개만 가능
  • 검색 속도 향상

비클러스터형 인덱스

  • 비유: 책 뒤쪽 색인
  • 정렬된 인덱스 포인터 층이 비정렬 테이블 페이지를 가리킴
  • 테이블당 여러 개 가능
  • 삽입·수정 성능 개선
SQL Server에서 쿼리 성능 향상하기

클러스터형 인덱스: B-트리 구조

 

  • 루트 노드

 

  • 브랜치 노드

 

  • 페이지 노드
SQL Server에서 쿼리 성능 향상하기

클러스터형 인덱스: B-트리 구조

ROOT NODE:                          
                                    A G O W
BRANCH NODES:
                A B E F             G H J K             O P S T
PAGE NODES:
          Page 1             Page 2             Page 3              Page 4
       Index Column |...  Index Column |...  Index Column | ...  Index Column | ...
       A | ...            E | ...            I | ...             M | ...
       B | ...            F | ...            J | ...             N | ...
       C | ...            G | ...            K | ...             O | ...
       D | ...            H | ...            L | ...             P | ...
       ...                ...                ...                 ...
SQL Server에서 쿼리 성능 향상하기

클러스터형 인덱스 없는 Customers 테이블

SELECT *
FROM Customers
WHERE CustomerID = "PARIS"
PAGE NODES:
            Page 1
         CustomerID |...
         ALFKI | ... 
         ANATR | ...
         BLONP | ... 
         BSBEV | ...
         ...                 
SQL Server에서 쿼리 성능 향상하기

클러스터형 인덱스 없는 Customers 테이블

SELECT *
FROM Customers
WHERE CustomerID = "PARIS"
PAGE NODES:
            Page 1              Page 2
         CustomerID |...     CustomerID|...
         ALFKI | ...         FOLIG | ...
         ANATR | ...         FRANK | ...
         BLONP | ...         GALED | ...
         BSBEV | ...         GREAL | ...
         ...                 ...
SQL Server에서 쿼리 성능 향상하기

클러스터형 인덱스 없는 Customers 테이블

SELECT *
FROM Customers
WHERE CustomerID = "PARIS"
PAGE NODES:
            Page 1              Page 2              Page 3
         CustomerID |...     CustomerID|...      CustomerID | ... 
         ALFKI | ...         FOLIG | ...         LILAS | ...  
         ANATR | ...         FRANK | ...         LINOD | ...  
         BLONP | ...         GALED | ...         MEREP | ...  
         BSBEV | ...         GREAL | ...         MORGK | ...   
         ...                 ...                 ...          
SQL Server에서 쿼리 성능 향상하기

클러스터형 인덱스 없는 Customers 테이블

SELECT *
FROM Customers
WHERE CustomerID = "PARIS"
PAGE NODES:
            Page 1              Page 2              Page 3               Page 4
         CustomerID |...     CustomerID|...      CustomerID | ...     CustomerID | ...
         ALFKI | ...         FOLIG | ...         LILAS | ...          OCEAN | ...
         ANATR | ...         FRANK | ...         LINOD | ...          PARIS | ...
         BLONP | ...         GALED | ...         MEREP | ...           
         BSBEV | ...         GREAL | ...         MORGK | ...          
         ...                 ...                 ...                  ...
SQL Server에서 쿼리 성능 향상하기

클러스터형 인덱스가 있는 Customers 테이블

SELECT *
FROM Customers
WHERE CustomerID = "PARIS"
ROOT NODE:                          
                                         ALFKI FOLIG OLDWO WOLZA
BRANCH NODES:
              ALFKI BONAP DRACD FISSA    FOLIG GALED LILAS NORTS    OCEAN OLDWO QUICK WOLZA
PAGE NODES:
                    Page 1              Page 2              Page 3               Page 4
                 CustomerID |...     CustomerID|...      CustomerID | ...     CustomerID | ...
                 ALFKI | ...         FOLIG | ...         LILAS | ...          OCEAN | ...
                 ANATR | ...         FRANK | ...         LINOD | ...          PARIS | ...
                 BLONP | ...         GALED | ...         MEREP | ...          PICCO | ...
                 BSBEV | ...         GREAL | ...         MORGK | ...          QUICK | ...
                 ...                 ...                 ...                  ...
SQL Server에서 쿼리 성능 향상하기

클러스터형 인덱스가 있는 Customers 테이블

SELECT *
FROM Customers
WHERE CustomerID = "PARIS"
ROOT NODE:                          
                                                     OLDWO WOLZA
BRANCH NODES:
              ALFKI BONAP DRACD FISSA    FOLIG GALED LILAS NORTS    OCEAN OLDWO QUICK WOLZA
PAGE NODES:
                    Page 1              Page 2              Page 3               Page 4
                 CustomerID |...     CustomerID|...      CustomerID | ...     CustomerID | ...
                 ALFKI | ...         FOLIG | ...         LILAS | ...          OCEAN | ...
                 ANATR | ...         FRANK | ...         LINOD | ...          PARIS | ...
                 BLONP | ...         GALED | ...         MEREP | ...          PICCO | ...
                 BSBEV | ...         GREAL | ...         MORGK | ...          QUICK | ...
                 ...                 ...                 ...                  ...
SQL Server에서 쿼리 성능 향상하기

클러스터형 인덱스가 있는 Customers 테이블

SELECT *
FROM Customers
WHERE CustomerID = "PARIS"
ROOT NODE:                          
                                                     OLDWO WOLZA
BRANCH NODES:
                                                                          OLDWO QUICK 
PAGE NODES:
                    Page 1              Page 2              Page 3               Page 4
                 CustomerID |...     CustomerID|...      CustomerID | ...     CustomerID | ...
                 ALFKI | ...         FOLIG | ...         LILAS | ...          OCEAN | ...
                 ANATR | ...         FRANK | ...         LINOD | ...          PARIS | ...
                 BLONP | ...         GALED | ...         MEREP | ...          PICCO | ...
                 BSBEV | ...         GREAL | ...         MORGK | ...          QUICK | ...
                 ...                 ...                 ...                  ...
SQL Server에서 쿼리 성능 향상하기

클러스터형 인덱스가 있는 Customers 테이블

SELECT *
FROM Customers
WHERE CustomerID = "PARIS"
ROOT NODE:                          
                                                     OLDWO WOLZA
BRANCH NODES:
                                                                          OLDWO QUICK 
PAGE NODES:
                                                                                 Page 4
                                                                              CustomerID | ...
                                                                              OCEAN | ...
                                                                              PARIS | ...
                                                                              PICCO | ...
                                                                              QUICK | ...
                                                                              ...
SQL Server에서 쿼리 성능 향상하기

클러스터형 인덱스가 있는 Customers 테이블

SELECT *
FROM Customers
WHERE CustomerID = "PARIS"
ROOT NODE:                          
                                                     OLDWO WOLZA
BRANCH NODES:
                                                                          OLDWO QUICK 
PAGE NODES:
                                                                                 Page 4
                                                                              CustomerID | ...



                                                                             PARIS | ...


SQL Server에서 쿼리 성능 향상하기

클러스터형 인덱스: 예시

SET STATISTICS IO ON
SELECT * 
FROM PlayerStats 
WHERE Team = 'OKC'

PlayerStats 테이블: 인덱스 없음

Table 'PlayerStats'. ..., logical reads 12, ...

 

PlayerStats 테이블: Team클러스터형 인덱스

Table 'PlayerStats'. ..., logical reads 2, ...
SQL Server에서 쿼리 성능 향상하기

연습해 봅시다!

SQL Server에서 쿼리 성능 향상하기

Preparing Video For Download...