인덱스란
책에서 원하는 내용을 빨리 찾으려면 인덱스를 이용해서 찾으면 편리하다.
이와 같이 DB에서도 인덱스를 만들어 놓으면 데이터를 빨리 찾을수 있게 데이터의 위치 정보를 모아 놓은 데이터 베이스 내의 객체이다.
인덱스는 정렬되어있다.
sql server의 실행계획에 보면table scan, index seek 라는 말을 볼수있는데, 각각 테이블을 전체 검색하는 것과 인덱스를 찾아서 검색하는 것을 뜻한다.
포인트쿼리(Point Query)
조회되는 값이 한 행인 쿼리
범위쿼리(Range Query)
조회되는 값이 여러 행인 쿼리
커버드쿼리(Covered Query)
넌클러스터 인덱스에서 조회되는 값이 인덱스가 걸려있으면서, where절과 같은 쿼리
클러스터 인덱스의 속도를 낸다.
클러스터인덱스
- 테이블당 1개씩만 허용된다.
- 범위쿼리와 포인트쿼리 둘다에서 성능을 발휘한다.
- PK설정시 그 컬럼은 자동으로 클러스터드 인덱스가 마늘어진다.
- 테이블 자체가 인덱스이다. (따로 인덱스 페이지를 만들지 않는다.)
- 데이터 입력, 수정, 삭제시 항상 정렬상태를 유지한다.
넌클러스터인덱스
- 인덱스 페이지를 따로만들기 때문에 용량을 더 차지한다.
- 인덱스 페이지는 로그파일에 저장된다.
- 레코드의 원본은 정렬되지 않고, 인덱스 페이지만 정렬된다.
- 테이블당 240개의 인덱스를 만들수있다.
- 포인트쿼리는 성능을 발휘하나, 범위쿼리는 성능을 보장할 수 없다.
결론
클러스터 인덱스는 데이터 위치를 바로 알기때문에 그 데이터로 바로 접근할 수 있고,
넌클러스터 인덱스는 인덱스 페이지를 한번 거져서 데이터에 접근하는 방식이다.
그러면 어떤 컬럼에 인덱스를 걸어야할까.
- WHERE절 뒤에 자주 사용되는 컬럼
- LIKE '%A'는 TABLE SCAN을 탄다.
- ORDER BY에 자주사용되는 컬럼
- JOIN으로 자주사용되는 컬럼
- NOT연산자는 긍정문으로 바꿔서 쓴다.
- 삽입과 삭제가 빈번한 컬럼은 인덱스로 좋지않다. (인덱스를 만드는데 사용되는 공간과, 정렬하는데 걸리는 시간등이 추가적으로 필요하다.)
'SQL > SQL 튜닝' 카테고리의 다른 글
옵티마이저 이해하기 - 2 (0) | 2017.10.26 |
---|---|
MSSQL LOOKUP (0) | 2017.10.24 |
Nested Loop, Sort Merge, Hash JOIN (0) | 2017.10.23 |
옵티마이저 이해하기 - 1 (0) | 2017.10.23 |
INDEX 튜닝 (0) | 2017.10.23 |