NDV, Density, Selectivity, Cardinality 란?

출처 : http://adenkang.tistory.com/10

Oracle에서 통계정보를 수집하다가 보면 NDV,Selectivity, Density, Cardinality 란 용어가 나온다. 얼핏 생각해보면 다 비슷한 말인 것 같아서 정확한 의미를 이해하기가 생각보다 쉽지 않다.

● NDV는 Number of Distinct Value의 약자로, 특정 Column에 unique한 값이 얼마나 있는지를
얘기하는 것이다. 예를 들면 A column에 값이 {1, 2, 3, 4, 5, 6, 7, 8, 9} 가 존재한다면 NDV는 9가
되는 것이다.

● Density는 우리말로 하면 밀도이다. Column에 존재하는 값의 종류가 1개라면 Density(밀도)는 1이 되는
것이고, 서로 다른 값의 종류가 10개라면 Density는 1/10 = 0.1 이 되는 것이다. 따라서 Density는
1/NDV로 표현할 수 있다. Density를 생각할 때 간과하지 말아야 할 것이 Histogram이다. Histogram이 없을
때는 무조건 Density는 1/NDV로 표현되지만, Histogram을 수집하게 되면 분포도를 고려한 Density가
Dictionary 정보에 입력된다.

● Selectivity는 Density와 유사한 이해가 되서 헷갈리는 개념이다. Density는 Column의 밀도를 계산한 것이라면 Selectivity는 predicate에 따라서 달라지는 값이다.

 Dept Code Emp
 10 T  Kang
 10  T  Lee
 10  T  Kang
 20  C  Kim
 20  C  Kim
 20  C  Lim
 20  C  Lim
30  D  Lim

dept = :b1 의 Selectivity는 1/NDV = 1/3 = 0.3333
dept = :b1 or code = :b2의 Selectivity는 (1/3) + (1/3) – (1/3)*(1/3) = 0.555
dept = :b1 and code = :b2의 Selectivity는 (1/3)*(1/3) = 0.111

predicate이 하나면 density와 같은 의미로 생각되지만 predicate이 많을 수도 있으므로 density와는 다른 개념이다.

● Cardinality는 Selectivity * Number of Rows이다. 실제로 주어진 predicate에 의해서 추출되는 row 수를 의미한다.
위의 예에서 dept = :b1의 Cardinality는 8*1/3 = 2.6 이 되는 것이다.

정확한 Cardinality 예측은 Optimizer가 최적의 execution plan을 선택하는데 가장 중요한 요인이다.

You may also like...

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다