본문 바로가기
mssql

MSSQL Include Index, Covered Index

by [김경민]™ ┌(  ̄∇ ̄)┘™ 2022. 7. 13.
728x90

 

## 커버드 인덱스(Covered Index, Covering Index)

 

아래 쿼리에서 Name과 Age에 index 가 설정 된 경우

```

SELECT Age

FROM [Table_Name]

WHERE Name = 'TEST';

```

- 출력되어야 하는 모든 컬럼이 인덱스 구성에 포함되어 있는 경우로 인덱스 내에서 모두 찾을 수 있기 때문에 I/O 감소

- 쿼리 조회 시 Index Key상에서 조회할 수 있는 컬럼들이 모두 존재하여 Disk로 가지 않고도 Data를 제공할 수 있는 대상을 의미

## 포괄열 인덱스(Include Index)

 

아래 쿼리에서 Name과 Age에 index 가 설정 된 경우

```

SELECT Age, Address, phone

FROM [Table_Name]

WHERE Name = 'TEST';

```

=> Address, phone 로 인해 Lookup 발생으로 I/O 발생

- Heap인 경우 RID Lookup을, Clustered Index 구성인 경우 Key Lookup 작업을 함

- 이때 Random Access가 발생하는 I/O가 증가하는 현상

 

```

CREATE NONCLUSTERED INDEX IX_Address_phone

ON [Table_Name] (Name, Age)

INCLUDE (Address, phone);

```

=> INCLUDE 하여 포괄열 인덱스 생성

=> Lookup 현상 발생하지 않아 I/O 감소

 

- 키가 아닌 열은 NonClustered Index에 대해서만 정의

- text, ntext 및 image 를 제외한 모든 데이터 형식을 키가 아닌 열로 사용할 수 있음

- 키가 아닌 열을 포함하여 여러 쿼리를 처리하는 비클러스터형 인덱스를 만드는 것

- 쿼리의 모든 열이 키 열 또는 키가 아닌 열로 인덱스에 포함되면 키가 아닌 열이 있는 인덱스는 쿼리 성능을 상당히 향상시킬 수 있음

- 성능이 향상되는 이유는 쿼리 최적화 프로그램이 테이블 또는 클러스터형 인덱스 데이터에 액세스하지 않고 인덱스 내에서 모든 열 값을 찾을 수 있으므로 디스크 I/O 작업을 줄어들기 때문임

 

 

출처 및 참고 사이트 리스트

 

[포괄 열을 사용하여 인덱스 만들기](https://docs.microsoft.com/ko-kr/sql/relational-databases/indexes/create-indexes-with-included-columns?view=sql-server-ver15)

 

[Include Index, Covered Index](https://www.sqler.com/board_SQLQA/707203)

 

[MSSQL Index의 모든 것](https://blog.naver.com/jaehoyaa/221492718692)

 

[MSSQL - 커버드 인덱스/포괄열 인덱스](https://blog.naver.com/PostView.naver?blogId=gmanf77&logNo=222362591332&parentCategoryNo=&categoryNo=43&viewDate=&isShowPopularPosts=true&from=search)

 

[[MSSQL] Covered Index / Include Index](https://spiritup91.tistory.com/26)

 

 

728x90

댓글