인덱스 생성 시 체크해야 할 리스트
* SQL Server 기준으로 작성하였습니다.
인덱스는 아래의 경우로 나뉠 수 있습니다.
- 테이블을 생성하면서 만드는 경우
- 서비스 도중에 쿼리가 추가되면서 만드는 경우
테이블을 생성하면서 만드는 경우에는 테이블에 접근하는 쿼리들을 최대한 수집 후에 필요한 인덱스를 생성하시면 됩니다.
1. 기존의 인덱스와 비교
1. 생성하려는 인덱스가 기존에 구성된 인덱스에 포함시킬 수 있는지 확인합니다.
2. 인덱스를 만드려고 하는 이유와 해당 인덱스를 사용하는 쿼리가 기존의 인덱스를 사용할 수는 없는지 확인합니다.
3. 인덱스를 생성함으로 써 쿼리가 가지고 있는 이슈가 해결되는 지 확인합니다.
-> '막무가내로 만들면 안된다' 를 전달하고 싶습니다.
2. 인덱스 생성 시 소요시간 체크
1. 인덱스를 생성 시 TAB LOCK 이 걸리기 때문에 생성 도중에는 쿼리가 해당 테이블에 접근할 수 없습니다.
이 말은 생성하는 시간동안에는 서비스를 못하게 된다는 의미이기 때문에 생성시간이 오래 걸리는 경우 점검시간을 잡아야 합니다.
( 이런 경우에는 Online 인덱스를 생각해 보세요. )
3. 인덱스 컬럼 정렬방식 확인
1. 인덱스의 정렬 방식과 쿼리의 정렬방식이 적절하지 않은 경우 SORT 비용이 발생합니다. 정렬방식이 올바른지 확인합니다.
4. 명명 규칙 확인
1. 인덱스 명에 규칙이 필요합니다.
예로 A, B, C 와 같은 컬럼으로 인덱스를 만들 때 _A_B_C 의 suffix 를 붙여두면 인덱스가 어떤 컬럼으로 구성되었는지 한 눈에 알 수 있습니다.
5. 인덱스 파일 그룹 확인
1. 파일 그룹이 Index 전용그룹(생성해야함)에 설정되었는지 확인합니다.
6. 인덱스의 종류 확인
1. 클러스터 인덱스 인지, 고유 인덱스인지, 일반 인덱스인지에 대해 확인합니다.
클러스터 인덱스의 경우 테이블 당 한개만 생성할 수 있으므로 클러스터 인덱스의 기준은 명확해야 합니다.
인덱스를 생성하면서 같이 확인할 것
1. 개발팀에서 테이블을 생성하면 서 인덱스를 같이 생성하려는 경우에는
테이블을 사용하는 쿼리를 먼저 수집한 후 인덱스를 구성하겠다고 가이드 해야합니다.
2. 인덱스를 막무가내로 생성하는게 아니라 쿼리를 최적화 할 수는 없는지 확인합니다.
3. 인덱스는 DML 성능에 악영향을 미치기 때문에 무조건 생성해서는 안됩니다.
( Read 비율이 매우 많은 서비스의 경우에는 많이 만들어 두는게 좋죠. 이 부분은 DBA 의 판단이 필요합니다. )
'Database > DBA 의 개인생각' 카테고리의 다른 글
[DBA] 테이블 삭제 시 체크해야 할 리스트 (0) | 2019.12.08 |
---|---|
[DBA] 컬럼 추가 시 체크해야 할 리스트 (0) | 2019.12.08 |
[DBA] 테이블 생성 시 체크해야 할 리스트 (1) | 2019.12.07 |
[DBA] 트리거가 성능에 미치는 악영향에 대해서 (0) | 2019.08.07 |
[DBA] 게시판 페이징 처리하는 방법 (Scan VS Seek) (0) | 2019.05.02 |