Database

[친절한 SQL 튜닝] NDV, 선택도 (Selectivity), 카디널리티 (Cardinality)

꼰딩 2023. 8. 16. 12:45

친절한 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, 선택도에 대해 제대로 알고있지 않습니다.)

 

혹시 잘못된 부분이 있다면 정정 부탁드립니다.

 

참조

해외사이트

국내사이트