최근 SQL SERVER 튜닝 가이드라는 책을 사서 튜닝을 공부해 보려고 하는데
첫 시작이 인덱스이다.
스캔 방식을 알아보기 전에 클러스터 vs 비 클러스터 인덱스에 대해 정리해 둔 것이 있으니
참고하면 좋을 듯 하다.
[MSSQL] 클러스터 인덱스(Clustered Index)와 비 클러스터 인덱스(Non Clustered Index)
인덱스(Index) 란? 인덱스는 데이터베이스에서 데이터를 빠르게 검색하기 위해 사용되는 데이터 구조이다.책의 목차나 색인처럼, 인덱스는 특정 데이터에 대한 위치 정보를 제공하여 검색 속도
murphy0v0.tistory.com
인덱스의 스캔 방식
1. Table Scan
- 테이블 스캔은 테이블의 모든 행을 처음부터 끝까지 훑어 데이터를 찾는 방식이다.
- 테이블에 인덱스가 없거나, 쿼리 조건에 맞는 인덱스를 사용하지 못할 때 발생한다.
- 작은 테이블에서는 괜찮지만, 불필요한 데이터를 모두 읽기에 큰 테이블에서는 성능이 매우 낮다.
2. Clustered Index Scan
- 클러스터형 인덱스를 사용하지만, 인덱스의 모든 데이터를 읽는 방식이다.
- 쿼리 조건이 많은 데이터 범위에 해당될 때 (예: WHERE Age > 20) 사용됨.
- 인덱스 키가 있지만 그 값을 가공했거나, 조건에 맞는 컬럼이 클러스터 인덱스에 포함되지 않은 경우에 사용됨.
- 클러스터형 인덱스로 데이터가 정렬되어 있어 Table Scan보다는 효율적이지만 많은 데이터를 읽기에 비용은 높은 편.
3. Clustered Index Seek
- 클러스터형 인덱스를 사용하여, 필요한 데이터만 빠르게 찾아가는 방식이다.
- 쿼리 조건이 인덱스에 포함되고, 정확한 범위를 지정할 때 (예: WHERE EmployeeID = 123) 사용됨.
- 매우 효율적이며, 데이터베이스에서 가장 선호되는 방식이다.
- 인덱스를 사용하여 필요한 데이터만 읽기 때문에 빠르고 자원을 적게 사용한다.
4. Non-Clustered Index Scan
- 비클러스터형 인덱스를 사용하지만, 인덱스 전체를 스캔하는 방식이다.
- 쿼리 조건이 인덱스 열에 맞지만, 조건이 너무 넓어서 인덱스를 모두 읽어야 할 때. (ex. WHERE Name LIKE 'A%')
- 클러스터형 인덱스가 없는 경우보다 효율적이지만, 여전히 범위를 좁히지 못하면 비용이 높다.
5. Non-Clustered Index Seek
- 비클러스터형 인덱스를 사용하여, 정확히 필요한 데이터만 읽는 방식이다.
- 쿼리 조건이 비클러스터형 인덱스를 정확히 사용할 수 있을 때 사용됨. ( WHERE Name = 'Alice' )
- 빠르고 자원 소모가 적다.
- 비클러스터형 인덱스는 테이블 전체를 읽지 않고, 특정 열에 대한 검색만 수행하기 때문에 효율적이다.
6. RID Lookup : Non-Clustered Index + Heap Table
- 비클러스터형 인덱스를 통해 데이터를 검색한 후, Heap 테이블(클러스터형 인덱스가 없는 테이블)에서 실제 데이터를 찾는 방식이다.
- 비클러스터형 인덱스는 리프 노드에 데이터 행의 물리적 위치(RID)를 저장하고, 이 정보를 기반으로 Heap 테이블에서 데이터를 찾아온다. (추가적인 데이터 접근 비용이 발생)
- Non-Clustered Index + Heap 이 되면 RID Lookup이 발생함.
* RID Lookup이란?
비클러스터형 인덱스를 통해 데이터를 검색한 후, Heap 테이블(클러스터형 인덱스가 없는 테이블)에서 데이터를 찾기 위해 다시 작업하는 것.
7. Key Lookup : Non-Clustered Index + Clustered Index
- Non-Clustered Index Seek으로 검색한 후, 그 키로 클러스터형 인덱스를 사용해 나머지 데이터를 가져오는 방식이다.
- 비클러스터형 인덱스는 키 값만 포함한다.
- 적은 데이터에서는 괜찮지만, 많은 데이터 행을 반복적으로 조회할 경우 성능 저하를 초래한다.
- RID-Lookup 처럼 Non-Clustered Index에 포함되지 않은 데이터까지 조회하는 경우에 발생한다.
* Key Lookup이란?
비클러스터형 인덱스를 사용하여 데이터를 검색한 후, 추가로 클러스터형 인덱스를 사용해 나머지 필요한 데이터를 찾는 작업.
각 방법 비교
'코딩 공부 기록 > SQL' 카테고리의 다른 글
[MSSQL] 통계 구성요소(Statistics) (1) | 2024.12.05 |
---|---|
[SQL] 인덱스 조각화 (0) | 2024.11.25 |
[MSSQL] 클러스터 인덱스(Clustered Index)와 비 클러스터 인덱스(Non Clustered Index) (0) | 2024.11.22 |
[MSSQL] 로컬 서버 사용하기 (SSMS, SQL Server Developer) (0) | 2024.11.22 |
[SQL] 데이터베이스 정규화 (1NF, 2NF, 3NF, BCNF, 4NF, 5NF) (2) | 2024.11.12 |