친절한 SQL 튜닝을 읽고 개념에 대해 정리합니다.
NDV (Number of Distinct Value)
유일하게 구별되는 컬럼 값 종류의 개수
예1 ) 성별 컬럼은 남자, 여자 두종류의 값으로 이루어져 있으므로 NDV(성별) = 2 이다.
예2 ) A1 컬럼이 A, B, C, D, E 5종류의 값으로 이루어져 있다면 NDV(A1) = 5 이다.
선택도 (Selectivity)
전체 레코드 중에서 조건절에 의해 선택되는 레코드 비율
선택도 = 1 / NDV (where = 조건)
선택도 = 반환되는 레코드 수 / 전체 레코드 수 (일반적으로)
카디널리티 (Cardinality)
전체 레코드 중에서 조건절에 의해 선택되는 레코드 개수
(실제 predicate에 의해서 추출되는 row 수를 의미)
카디널리티 = 총 로우 수 * 선택도 = 총 로우 수 / NDV
선택도와 카디널리티는 무조건 책에 나온 공식대로 나타나는줄알았는데,
해외 사이트를 보니 그런건 아니였습니다. 값의 대소는 상대적이라고 생각됩니다.
성별의 카디널리티를 검색하면 제가 확인했던 모든 블로그에서는 2라고 나와있는데,
NDV가 2인거지, 카디널리티는 총 레코드 수와 해당 조건에 맞는 레코드 수에 의존하므로 잘못된 정보라고 생각됩니다.
심지어 chatgpt도 성별의 카디널리티는 총 레코드 수와 관계없이 2라고 해서 더 헷갈립니다.
(글쓴 시점에 확인 결과, chatgpt는 현재 카디널리티와 NDV, 선택도에 대해 제대로 알고있지 않습니다.)
혹시 잘못된 부분이 있다면 정정 부탁드립니다.
참조
'Database' 카테고리의 다른 글
[Real MySQL 8.0] 아키텍처 - MySQL 엔진 아키텍처 (0) | 2023.09.05 |
---|---|
[Real MySQL 8.0] 사용자 및 권한 (0) | 2023.09.01 |
[Real MySQL 8.0] mysql 설치와 설정 (0) | 2023.08.28 |
MongoDB에서 bulkWrite updateOne upsert를 할 때 filter: _id 주의점 (0) | 2023.03.28 |