[SQL] INDEX (인덱스)
SQL Server에서 사용하는 INDEX에 대해 공부해보려한다. 데이터가 많을수록 쿼리를 잘 짜는 것도 중요하지만, 기본 개념을 잘 숙지하고 있도록 하자!
페이지(PAGE)
인덱스에 대해 알기 전, 페이지를 알아야 한다. 데이터 INSERT 시, 페이지에 들어가게 되고 그 페이지에서 SELECT를 한다. 대부분 Data로 구성되어 있지만, 일부 페이지는 인덱스(데이터 위치), 텍스트/이미지 등으로 구성되어 있다.
- SQL Server의 기본 저장 단위 (8KB)
- 1MB에는 128Pages가 존재
- 데이터를 읽을 때 페이지의 모든 행이 읽어짐
(참고 : https://laigo.kr/41, https://jungwoong.tistory.com/32)
힙(heap)?
인덱스를 알기 전, 인덱스가 적용되지 않은 힙에 대해 우선 알아보자. 정렬 기준이 없이 저장된 테이블 형태. 페이지들 간의 순서가 없고, 페이지 내의 행들 간에도 순서가 없다.
인덱스를 적용하지 않은 테이블이라고 보면 쉽다.
장점
INSERT를 하기에 적합하다. 기존 페이지의 빈 곳에 추가만 하면 되고, 빈 공간이 없을 경우 새로운 페이지에 추가하면 된다.
단점
SELECT를 하면 비효율적이다. 데이터가 많을수록 그렇다. 데이터를 찾을 때, Table scan을 해야하는데 페이지를 다 읽기 때문에 느릴 수 밖에 없다.
인덱스
테이블의 데이터를 조회할 때, 뷰의 행 검색 속도를 향상시키는 역할을 하는 데이터 구조이다.
인덱스를 왜 사용할까
- 빠른 검색을 위해 사용한다.
- 데이터의 중복을 방지한다.
- 동시성을 높여준다.
인덱스의 단점
- 조회는 빠르지만 INSERT, UPDATE 등을 수행할 때는 느려지기 때문에 조회가 많은 테이블을 기준으로 설정하여야 한다.
- 물리적인 공간을 차지한다.
- 데이터가 적다면 유지관리 부담이 더 클 수 있다.
인덱스의 종류
테이블의 존재 형태는 힙과 클러스터형 인덱스로 나뉜다. 키 값과 연결된 행을 빠르고 효율적으로 찾을 수 있는 B-Tree 구조에 저장된다.
- 클러스터형 인덱스
- 비클러스터형 인덱스
클러스터형 인덱스
- 테이블당 1개씩만 허용된다.
- PK 설정 시, 그 칼럼은 자동으로 클러스터 인덱스가 만들어진다.
- 비클러스터형 인덱스보다 검색 속도가 더 빠르다. but, 데이터 입력, 수정, 삭제는 느리다.
비클러스터형 인덱스
- 인덱스 페이지는 로그파일에 저장
- 테이블 당 240개 인덱스를 만들 수 있다.
- 인덱스 자체의 리프 페이지는 데이터가 아닌 포인터(RID)라서 검색 속도는 느리지만, 데이터의 입력, 수정, 삭제는 더 빠르다.
결론
클러스터 인덱스는 위치를 바로 알기 때문에 그 데이터에 바로 접근이 가능하고, 비클러스터 인덱스는 페이지를 한 번 거쳐서 데이터에 접근하는 방식이다.