인덱스 생성 순서에 따른 내부 작업 변화
인덱스에는 여러 종류가 있지만 가장 많이 사용하는 부분이 클러스터 인덱스와 넌-클러스터 인덱스 이지 않을까 생각 합니다.
그렇다면 클러스터 인덱스와 넌-클러스터 인덱스가 있을 때 인덱스 생성 순서에 따라 성능 문제가 발생할까? 입니다. 좀더 정확히 말하면 인덱스 생성순서에 따라 내부적으론 어떻게 작동할까 입니다.
결론부터 말하면 넌-클러스터 인덱스가 있는 상태에서 클러스터형 인덱스를 추가하면 RID 값 대신 클러스터형 인덱스의 키 값을 기존 인덱스가 내부적으로 재구성 됩니다.
다음 예제를 통해서 알아 보도록 하겠습니다.
- 전체 코드
BEGIN TRY DROP TABLE TBL_X END TRY BEGIN CATCH END CATCH GO
CREATE TABLE TBL_X (NUM INT, NAME NVARCHAR(50)) GO
INSERT INTO TBL_X VALUES (1, 'HTTP://SQLMVP.KR') INSERT INTO TBL_X VALUES (3, 'HTTP://SQLMVP.KR') INSERT INTO TBL_X VALUES (2, 'HTTP://SQLMVP.KR') INSERT INTO TBL_X VALUES (5, 'HTTP://SQLMVP.KR') INSERT INTO TBL_X VALUES (4, 'HTTP://SQLMVP.KR') GO
SELECT * FROM TBL_X
SET STATISTICS PROFILE ON
CREATE INDEX IX_TBL_X_NUM ON TBL_X (NUM) GO
CREATE CLUSTERED INDEX CI_TBL_X_NUM ON TBL_X (NUM) GO
DROP index TBL_X.CI_TBL_X_NUM
SET STATISTICS PROFILE OFF |
테이블을 생성하고 데이터를 입력 합니다.
SET STATISTICS PROFILE ON 을 실행하고 넌-클러스터 인덱스를 생성 합니다. 아래 그림처럼 넌-클러스터가 생성되는 과정을 확인 할 수 있습니다.
그리고 클러스터 인덱스를 생성해 보도록 하겠습니다. 넌-클러스터 인덱스와는 다르게 2개의 실행계획이 나타 납니다. 실행계획을 보면 처음에 클러스터 인덱스를 생성합니다. 두 번째 실행 계획을 보면 클러스터 인덱스 (CI_TBL_X_NUM)를 읽어서 넌-클러스터 인덱스(IX_TBL_X_NUM)를 재구성 했음을 확인 할 수 있습니다.
이번에는 클러스터 인덱스를 삭제해 보도록 하겠습니다. 넌-클러스터 인덱스가 클러스터 인덱스의 키 값 대신 테이블을 스캔 하여 RID값을 갖도록 기존 인덱스가 재구성 되는 것을 확인 할 수 있습니다.
그렇다면 클러스터 인덱스를 생성하고 넌-클러스터 인덱스를 생성하면 어떻게 될까요?
꼭 직접 해보시길 바랍니다. ^^
2012-08-03 / 강성욱 / http://sqlmvp.kr
'SQL Server > SQL Server Tip' 카테고리의 다른 글
활성 트랜잭션 찾기 (0) | 2015.07.17 |
---|---|
Forwarded Record (행 이동에 대한 포워드) (0) | 2015.07.17 |
Ghost Record(인덱스에서 행 삭제시 발생) (1) | 2015.07.17 |
프로시저, 함수, 트리거 생성 정보 보기 (0) | 2015.07.17 |
힙테이블에서 행을 삭제하면 어떻게 처리 될까? (0) | 2015.07.17 |