운영중 궁금한것이 있어 질문 드립니다!
17 개의 컬럼을 가진 테이블에
7개의 인덱스를 설정 했습니다.
클러스터 인덱스 1개(인덱스 컬럼1개) + 넌클러스터인덱스 5개 (인덱스 컬럼 1개) + 넌클러스터인덱스 1개(복합 컬럼)
[인덱스 컬럼명] [인덱스 종류]
No (클러스터 인덱스)
CreateDay (넌클러스터인덱스)
Email (넌클러스터인덱스)
Name (넌클러스터인덱스)
Name, Birthday, Gender (넌클러스터인덱스)
NickName (넌클러스터인덱스)
ID (넌클러스터인덱스)
[컬럼명] [컬럼타입]
No int
CreateDay date
Email nvarchar(512)
Name nvarchar(500)
Birthday nvarchar(200)
Gender int
Nickname nvarchar(100)
이렇게 7개의 인덱스를 만드니
인덱스 용량이 테이블용량보다 많아지는 현상이 나옵니다..ㅠㅠ
보통 한 테이블에 5개 이상 인덱스를 설정 해놓으면 성능이 저하가 된다고 알고 있는데요.
이유가
DML시 인덱스 수 만큼 index split가 일어나 그에 따른 성능 저하 현상이 일어나는 건가요?
필요에 의해서 위와 같이 7개의 인덱스를 만들긴 했지만..
현재는 소량의 데이터지만 추후 대용량 테이블이 되었을때 어떠한 문제들이 있을까요..ㅠ
만약 대용량시 위의 구조로 성능상 안좋을경우
어떠한 방법이 있을까요.? (커버드 인덱스 이용..등)
조언 부탁 드립니다.
감사합니다.
Comment 5
-
자리비움
2014.11.19 14:45
일반적인 OLTP 환경에서 5개 이상의 인덱스가 있어도 5개를 다 쓰지 않습니다.(인덱스 힌트 등 특정 상황에서 인덱스 사용을 강제하지 않았을 경우)또, DML시 index split 발생으로 인해 범위 검색 시 성능 저하가 일어날 수는 있지만비즈니스에 따라 index split가 발생하지 않는 인덱스도 있고,covered index 컬럼에 따라 단일 인덱스보다 더 잦은 split 이 발생할 수도 있습니다.아래의 상황을 확인하시고 적절한 인덱스 생성을 고려해보시면 됩니다.1. 해당 테이블의 query 중 where 조건절에 반드시 오는 컬럼을 선별2. 인덱스 사용량을 조회할 수 있는 dmv를 이용하여 현재 설정된 인덱스의 사용 여부/빈도 판단3. 범위 조회에 유리한 컬럼인 경우 clustered index 설정 고려4. 인덱스 제거 등으로 인해 sort가 발생할 수 있는 부분 확인5. RID Lookup 등을 피하기 위해 인덱스를 설정한 경우 covered index, include index(2005이상) 고려 -
향지
2014.11.19 17:22
사전과 사전에 있는 색인을 생각하시면 어떨까 합니다.
저 테이블은 7개의 색인이 있는것과 비슷하구요
update, delete, insert시에 7곳에서 변경이 있을수 있습니다.
위에 부분 말씀처럼 split도 고려해주시구요
개인적으로 좀 다시 봐주셨으면 하는 부분이 조금 있네요
Name (넌클러스터인덱스)
Name, Birthday, Gender (넌클러스터인덱스)이거 두개는 고려해보시고 name 인덱스는 빼시구요
Birthday nvarchar(200)
생일은 날짜로 해주시는것이 좋을것 같은데 이부분도 한번 확인해주시구요.
회원 테이블의 경우에는 입력 보다는 조회쪽으로 좀 더 비중을 가지고 인덱스를 선정하시면 어떨까 합니다.
개인적인 경험에 의하면 어느정도 시간이 지나면 조회비중보다 가입비중은 작아집니다.
인덱스는 조회하기에 좋은 기능이구요. 인덱스가 많다고 무조건 않좋은건 아닙니다.
인덱스가 필요하시면 넣는건 어쩔 수 없습니다.
-
가지마세요
2014.11.19 18:57
답변 달아주신 자리비움님, 향지님 조언 및 말씀 감사 합니다.
위 향지님 말씀에 궁금한것이 있어 말씀드려요.
Name (넌클러스터인덱스)
Name, Birthday, Gender (넌클러스터인덱스)위 2개 인덱스에서
조건을 Name 컬럼만으로 하는 조회 쿼리가 있고Name, Birthday, Gender 3개의 컬럼을 조건으로 두는 조회쿼리가 있어
위와 같이 2개의 인덱스를 생성한것 같아요.
Name 인덱스 제거시 해당 name 으로만 조회하는 부분에 대해서는 문제가 없을까요?ㅠ
그리고 ㅠㅠ
말씀대로 해당 테이블이 조회쪽으로 비중이 크다면 7개의 인덱스로 인한 split 부분 보다.
인덱스 총용량이 커지긴 하지만
적절하게 만들어진 5개이상 의 인덱스가 더 운영상 좋을수도 있다는 말씀이신가요?!
-
향지
2014.11.19 20:50
정확한건 어떻게 되어 있나 봐야 확실하게 말할 수 있습니다만
name만으로 검색해도
Name, Birthday, Gender (넌클러스터인덱스) 이 인덱스를 사용할것 같습니다.
정확한건 모르겠지만 두개 유지하는거 보다는 좋을것 같아서 얘기 드렸습니다.
직접 테스트 해보시는게 좋을것 같습니다.
필요한 인덱스는 만드는게 전체적으로 봤을때 좋습니다.
5개째 만들어서 갑자기 성능 나빠지고 그런건 아닙니다.
하나 만들때마다 일정 부분씩 나빠지는데 그것보다 얻는게 많으면 만들어야됩니다.
그리고 split은 날수도 있고 안날수도 있습니다.
B-tree 부터 공부해보시면 좋을것 같습니다.
-
가지마세요
2014.11.19 22:02
그렇군요!
조언해주신 부분 참고하여 공부해야될것 같아요 ㅎ
많은 도움이 되었습니다ㅎ 감사합니다!