데이터를 다루는 DB나 빅데이터 분야에서 ‘카디널리티(Cardinality)’와 ‘선택도(Selectivity)’는 자주 언급되는 용어다. 이 용어의 차이점을 잘 알고 있어야 데이터의 특성을 잘 파악할 수 있다.
카디널리티(Cardinality)와 선택도(Selectivity)는 절대적인 수치 계산이라기보다는 두 개의 데이터 집합의 특성을 비교하는 상대적인 개념으로 사용해야한다.
카디널리티(Cardinality)
카디널리티(Cardinality)는 특정 데이터 집합의 유니크(Unique)한 값의 개수이다. 예를 들어 데이터베이스에 '성별' 컬럼의 경우 남자와 여자라는 값을 갖는다. (생물학적인 성별만 고려하자면) 이 경우 카디널리티는 2다.
반면 주민등록 번호는 테이블에 존재하는 모든 레코드에 유니크 할 수 있다. 이 경우 주민등록 번호의 카디널리티는 테이블에 들어있는 레코드의 개수가 된다.
오라클에서 카디널리티를 구하는 쿼리는 다음과 같다.
select count(distinct (deptno)) from employee;
선택도(Selectivity)
선택도는 카디널리티로부터 계산할 수 있는 값이다.
Selectivity = Cardinality / Total Number Of Records
선택도는 데이터 집합에서 특정 값을 얼마나 잘 골라낼 수 있는지에 대한 지표이다. 선택도가 1이라는 뜻은 모든 값이 유니크하다는 의미다.
선택도는 데이터베이스에서 인덱스를 생성할 컬럼을 고를 때 자주 사용한다. 선택도가 높은 컬럼에 인덱스를 걸면 인덱스가 특정 레코드를 잘 골라내어 인덱스 효율이 높아진다. 반대로 선택도가 낮은 컬럼에 인덱스를 걸게 되면 인덱스 효율이 낮아지게 되고, 결국 풀 테이블 스캔으로 플랜이 풀리게 될 수 있다.
오라클에서 선택도를 구하는 쿼리는 다음과 같다.
SELECT (distinct_keys / num_rows) AS Selectivity
FROM dba_indexes
WHERE index_name like 'Index_Name' and Owner ='Table_Owner';
오라클이 제공하는 카탈로그 뷰 중 'dba_indexes" 뷰를 조회하면 특정 인덱스의 선택도를 알 수 있다.
데이터베이스에서 인덱스의 선택도를 높이는 방법은 간단하다. 두 개 이상의 컬럼을 조합해서 인덱스를 걸어주면, 조합된 인덱스 키의 카디널리티가 증가하고 결국 선택도도 증가하여 효율이 좋은 인덱스가 된다. (대신 인덱스 키를 많이 사용하여 공간 효율이 낮아지게 된다.)
댓글