MS-SQL 질문 드립니다.(Include Index, Covered Index)
제가 인터넷을 통하여 검색한 결과, 아래의 자료를 얻을 수 있었습니다.
하지만 이해가 되지 않는 부분이 있어 이렇게 글을 쓰게 되었습니다.
Covered Index
모든 데이터를 인덱스에서 찾기 때문에 테이블 스캔이나 비 클러스터형 인덱스만을 이용하는 경우보다 훨씬 빠르게 수행이 가능합니다. 하지만 Covered는 Root부터 Leaf까지 Update 되어야 하는 비용이 많이 발생합니다.
Include Index
인덱스에 인덱스 키(정렬) 열과 함께 키가 아닌 열(비정렬)들을 포함할 수 있게 확장된 비 클러스터형 인덱스 입니다. 인덱스 키만이 비리프레벨에 존재 하고, 나머지 Include절에 포함된 열에 대해서는 리프레벨에만 존재 하게 됩니다. SP(stored Procedure : 저장 프로시저) 내부 구문에서 특정테이블의 WHERE, ORDER BY, SELECT절의 다수 열을 모두 Covered하는 인덱스의 생성이 필요하나 최대 키의 크기가 이를 초과할 경우 유용하게 사용할 수 있습니다. 포괄 열에 너무 많은 열을 포함할 경우 인덱스 성능이 더 떨어질 수 있다는 점이 있습니다.
두개의 인덱스의 차이점과 장점을 쉽게 설명 부탁드립니다.
그리고 어떠한 경우 Covered Index를 사용해야하고
어떠한 경우 Include Index를 사용해야 하는지 알고싶습니다.
제가 인터넷을 통하여 검색한 결과, 아래의 자료를 얻을 수 있었습니다.
하지만 이해가 되지 않는 부분이 있어 이렇게 글을 쓰게 되었습니다.
Covered Index
모든 데이터를 인덱스에서 찾기 때문에 테이블 스캔이나 비 클러스터형 인덱스만을 이용하는 경우보다 훨씬 빠르게 수행이 가능합니다. 하지만 Covered는 Root부터 Leaf까지 Update 되어야 하는 비용이 많이 발생합니다.
Include Index
인덱스에 인덱스 키(정렬) 열과 함께 키가 아닌 열(비정렬)들을 포함할 수 있게 확장된 비 클러스터형 인덱스 입니다. 인덱스 키만이 비리프레벨에 존재 하고, 나머지 Include절에 포함된 열에 대해서는 리프레벨에만 존재 하게 됩니다. SP(stored Procedure : 저장 프로시저) 내부 구문에서 특정테이블의 WHERE, ORDER BY, SELECT절의 다수 열을 모두 Covered하는 인덱스의 생성이 필요하나 최대 키의 크기가 이를 초과할 경우 유용하게 사용할 수 있습니다. 포괄 열에 너무 많은 열을 포함할 경우 인덱스 성능이 더 떨어질 수 있다는 점이 있습니다.
두개의 인덱스의 차이점과 장점을 쉽게 설명 부탁드립니다.
그리고 어떠한 경우 Covered Index를 사용해야하고
어떠한 경우 Include Index를 사용해야 하는지 알고싶습니다.
일단 커버드 인덱스가 인덱스의 한 종류는 아닙니다.
커버드 인덱스를 만드는 구문이라는건 존재하지 않습니다.
어떤 쿼리가 우연히 요구하는 데이타가 모두 인덱스의 키에 포함될때 그 인덱스를 커버드 인덱스라고 하는거지요.
보통 인덱스는 검색조건에 사용되는 컬럼들로 구성하게 됩니다.
예를 들어서 출발일, 상품코드 라는 조건으로 검색이 자주 일어나면
출발일과 상품코드를 인덱스로 만들겠지요.
근데 쿼리가 SELECT 출발일, 상품코드, 상품명... 이런식이면
상품명을 가져오기 위해서 랜덤엑세스가 발생하게 됩니다.
인덱스가 클러스터드 인덱스라면 추가적인 랜덤엑세스가 발생하지 않겠지만
넌클러스터드 인덱스라면 랜덤엑세스가 발생하겠죠. (테이블에 클러스터드가 존재하면 키룩업, 없으면 RID룩업)
이런 랜덤엑세스는 보통 성능을 많이 떨어뜨립니다.
그럼 이 랜덤엑세스를 줄이는 방법이 뭐가 있을까요??
인덱스를 만들때 인덱스의 키에 상품명까지 포함시켜버리는겁니다.
그러면 랜덤엑세스가 발생하지 않죠. 이럴때 커버드 인덱스라고 합니다.
근데 문제는 "상품명"은 검색에는 사용하지 않지만 단지 랜덤엑세스를 막기 위해 키에 추가시켜놓은거라서
인덱스의 크기도 커지지만 상품명이 변경되었을때 인덱스 페이지 곳곳이 변경되겠죠.
게다가 인덱스의 키들은 총합이 900바이트인가(가물가물)를 넘을수 없습니다.
그래서 경우에 따라서는 "상품명"을 인덱스 키에 포함을 못시키는 경우도 발생하겠죠.
그래서 인덱스의 키에는 포함시키지 않고 인덱스 페이지의 맨 마지막 리프레벨에만 데이터를 추가 시킨 형태가 인클루드 인덱스입니다. (잘 생각해보면 모양도 성능도 클러스터드 인덱스와 거의 동일합니다.)
그러면 상대적으로 인덱스의 크기도 작아지고, 그러면 Disk Read도 작아지고
데이터가 업데이트 될때도 리프레벨만 변경하면 되고
인덱스 키의 크기 제약에서도 자유롭고....
결론적으로...
검색조건에 사용된다면 인덱스의 키로 사용
여기에 추가적으로 랜덤엑세스를 막고 싶다면 인클루드 하면 되겠습니다.