분포도가 낮을수록 좋다는데 왜 성별은 분포도가 좋지 않다는 거지? 라는 의문을 해소하기 위해 알아본 자료를 정리해보았다.
Selectivity
선택성, 분포도 양쪽으로 번역되는 것 같다. 개인적으로는 선택성이라는 번역이 해당 내용에 대한 이해를 돕는 것 같다. 이유는, 이 개념이 필요한 이유가, 인덱스를 구성하기 위해 한 테이블에서 어떤 속성을 선택할지를 결정하기 위함이기 때문이다.
선택성이/분포도가 좋다는 말은 내가 원하는 값을 쉽게 찾아갈 수 있다는 뜻이다.
이를 위해서는 특정 컬럼의 데이터가 테이블에 평균적으로 분포되어 있는 정도를 알아야 한다.
산식
해당 컬럼 기준으로 distinct(중복제거)된 count / 전체 count
- col1 컬럼 : 전체 건수 100건, 값들은 모두 A, B 의 2가지뿐일 경우
- 분포도(selectivity) : 2% (값/전체건수 : 2/100 * 100)
- col2 컬럼 : 전체 건수 100건, 값들은 모두 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 의 10가지일 경우
- 분포도(selectivity) : 10% (값/전체건수 : 10/100 * 100)
- col3 컬럼 : 전체 건수 100건, 값들은 모두 1, 2, ... , 50 의 50가지일 경우
- 분포도(selectivity) : 50% (값/전체건수 : 50/100 * 100)
분포도가 (너무) 낮다
100건의 전체 행들은 col1 컬럼 기준으로 A 아니면 B의 값을 가진다. 즉, col1을 인덱스로 삼는다면 전체값 100개를 단순하게 반반으로 나뉠 뿐이다. 결국 대략 반 정도로 줄어든 항목에서 찾아야 되기 때문에, 이를 선택성이/분포도가 좋지 않다고 표현하며, 인덱스로 사용하기 좋지 않다.
분포도가 높다
반면에 col3 컬럼 기준으로 보면 100건의 전체 행들은 50건의 값을 가진다. 이런 식으로 분포도가 증가하게 되면, 대략 15% 이상부터는 오히려 인덱스를 통해 검색하는 편이 전체 데이터를 읽는 것보다 더 느려진다 한다. 이 역시 선택성이/분포도가 좋지 않다고 표현하며, 인덱스로 사용하기 좋지 않다.
이처럼 분포도는 너무 낮아도, 높아도 좋지 않음을 알 수 있다.
인덱스로 삼기에 적정한 분포도
'분포도가 좋다'고 표현하는 분포도는 col2 컬럼과 같은 10%~15%이다.
100퍼센트 기준으로 보면 상대적으로 10~15%는 명백하게 낮은 편에 속하기에 일반적으로 선택성이 좋으려면 분포도가 낮아야 된다고 표현하는 것 같다.
REF
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=kang_sok&logNo=60057985829