데이터에 빠르게 접근할 수 있도록 도와줌

데이터베이스 튜닝에 중요


잘못 사용하면 성능 저하

인덱스를 저장할 추가 공간 필요

데이터 변경 작업 (insert, update, delete)가 자주 일어나면 성능 저하



-clustered index

영어사전과 같은 형식

테이블당 1개만 생성 가능

생성 시 데이터 전체 정렬

행 데이터를 인덱스로 지정한 열에 맞춰서 자동 정렬

루트 페이지와 중간 페이지, 그리고 리프 페이지는 인덱스로 구성되어 있으며 리프 페이지 자체가 데이터 페이지


-nonclustered index

인덱스가 별도로 있고 인덱스를 찾은 후 해당 부분으로 가야 실제 내용 확인 가능

여러개 생성 가능

데이터 페이지를 건드리지 않고 별도의 인덱스 페이지를 생성

리프 페이지에 인덱스로 구성한 열을 정렬하고 데이터 위치 포인터를 생성

데이터 위치 포인트는 페이지번호+#오프셋 으로 기록되어 이는 데이터 영역의 데이터의 위치를 가리킴

일정 수 이상의(전체 데이터의 약 1~3%) 스캔을 할 경우 테이블 스캔을 실시함



-clustered와 nonclustered index가 테이블에 같이 있을 경우

clustered의 인덱스 페이지는 동일하지만 nonclustered는 리프 페이지에 포인터 대신 clustered의 키 값을 가지고 있음

기존처럼 포인터로 찾아가지 않고 clustered 키값을 가지고 clustered index 페이지에서 검색을 함



인덱스는 컬럼단위로 생성

하나 또는 여러개의 컬럼에 생성 가능

제약조건 없이 테이블 생성 시에 인덱스를 만들 수 없으며 인덱스가 자동 생성되기 위한 열의 제약조건은 primary key와 unique 뿐




-primary key

1개만 생성 가능

다른 clustered index로 지정된 인덱스가 없으면 기본적으로 clustered index로 생성 됨

생성 시 nonclustered 옵션을 주면 nonclustered 인덱스로 생성 됨



-unique

여러개 생성 가능

기본적으로 nonclustered index

clustered index로 설정 가능



인덱스는 균형 트리와 유사한 방식으로 동작

sql 데이터는 페이지라는 단위로 저장됨

select에 유리한 방식으로 저장됨

insert, update, delete 등 작업이 일어나면 트리로 연결되어있는 노드(페이지)의 정렬, 페이지 공간 부족시 페이지 분할 이 일어나기때문에 느려질 수 있음



인덱스 삭제시에는 drop index [테이블].[인덱스] 형식을 사용

제약조건으로 생성된 인덱스는 drop index 로 삭제 불가

alter table [테이블] drop constraint [인덱스] 로 삭제 해야함



데이터의 중복도가 높은 열은 인덱스를 만들어도 별 효용이 없다

외래 키가 사용되는 열에는 인덱스를 생성해주는 것이 좋다

join에 자주 사용되는 열에는 인덱스를 생성해주는 것이 좋다

사용하지 않는 인덱스는 제거

계산 열 (persisted)도 인덱스를 만들 수 있다

포괄 열이 있는 nonclustered 인덱스를 활용하면 쿼리 성능을 높일 수 있다

포괄 열을 nonclustered로 인덱스를 만들면 clustered 처럼 리프 노드에 데이터가 존재하게 됨



+ Recent posts