Clustered Index란?
SQLSERVER는 PK제약을 걸때 non-clustered 옵션을 지정하지 않으면 default로 clustered index가 만들어짐.
참고로 이 Clustered Index는 오라클에서의 테이블일체형 인덱스(Table based index -> index의 leaf레벨이 곧 데이터인 index)와 같다.
그래서 Clustered Index는 테이블당 딱 1개만 생성될 수 있다.


Non-Clustered Index란?
index의 leaf레벨이 테이블 데이터영역의 주소만을 가지고있고 
테이블의 데이터영역과는 별개로 정렬되어 관리되는 데이터로 테이블당 여러개 생성될 수 있다. 우리가 알고있는 일반적인 인덱스다.


일단 SQLSERVER에서는 Clustered Index가 하나 만들어지고 난후에 추가적으로 생성되는 인덱스(non-clustered index)는 기 생성된 Clustered Index를 이용하여 탐색하도록 되어 있다.
즉 Non-Clustered Index는 leaf 레벨에 키값에 해당하는 데이터가 있는 페이지 번호 + 행번호 구성이 Clustered index의 키값을 가리키게 된다.

물론 Clustered index없이 그냥 일반적인 Non-clustered index로만으로도 구성할 수 있다.

그럼 왜 SQLSERVER는 Clustered Index를 만들면 Non-Clustered Index는 Clustered index를 이용하여 데이터를 탐색하는가?

SQLSERVER의 고유한 index관리 방식으로

일반적인 인덱스관리 방식은 테이블의 데이터가 추가/수정/삭제되면 해당컬럼으로 구성된 Non-clustered index의 leaf level은 정렬을 위해서 작업(index branch level split, leaf page splite 등등)을 하게 된다.

SQLSERVER는 Clustered Index의 leaf level이 곧 데이터 이므로 데이터의 변경이 발생하면 변경된 데이터가 위치할 제자리를 찾아서 정렬작업이 발생하게 된다. 만약  Non-clustered index의 leaf level이 이 데이터 page의 행번호를 바라본다면 데이터가 변경될때마다 해당 테이블의 모든 Non-clustered index는 정렬작업이 정신없이 발생하게 된다. 왜 데이터 page의 페이지번호와 행번호가 변경되니까.

그러나 Clustered Index의 키값을 바라보게 되면 Clustered Index의 leaf레벨이 수정/정렬(leaf레벨이 곧 데이터이므로)작업을 하지만 

나머지 Non-clustered index의 leaf level은 Clustered Index의 키값으로 연결되어 있기 때문에 정렬overhead가 줄어들게 되기 때문이다.

 

그리고 SQLSERVER의 index는 null 값을 index로 관리하기 때문에 is null 조건으로 검색해도 index탐색이 된다.