본문 바로가기
IT

카디널리티(Cardinality)와 선택도(Selectivity)에 대한 이해

by geddy 2024. 1. 21.

데이터를 다루는 DB나 빅데이터 분야에서 '카디널리티(Cardinality)'와 '선택도(Selectivity)'는 자주 언급되는 용어입니다. 이 용어들에 대해서 자세히 알아봅니다.

카디널리티(Cardinality)와 선택도(Selectivity)에 대한 이해 썸네일

  • 카디널리티
  • 선택도

카디널리티(Cardinality)


 

 

카디널리티(Cardinality)와 선택도(Selectivity)는 절대적인 수치 계산보다는, 두 개의 데이터 집합 특성을 비교하는 상대적인 개념으로 사용됩니다. 

카디널리티(Cardinality)는 특정 데이터 집합에서 고유한 값의 개수를 의미합니다. 

예를 들어, 데이터베이스의 '성별' 컬럼은 남자와 여자라는 값을 가지므로, 이 경우 카디널리티는 2입니다. 

중복도가 낮을수록 카디널리티가 높다고 표현합니다. 

반대로, 중복도가 높을수록 카디널리티가 낮다고 표현합니다. 

카디널리티는 특정 컬럼의 중복 수치를 나타내는 지표로 사용됩니다. 

예를 들어, 주민등록번호 같은 경우 중복되는 값이 없으므로 카디널리티가 높다고 할 수 있습니다. 

이에 비해 이름은 주민등록번호에 비해 중복되는 값이 많으므로, 이름은 주민등록번호에 비해 카디널리티가 낮다고 할 수 있습니다. 

주민등록번호에 비해라는 부분을 강조한 이유는, 카디널리티는 상대적인 개념으로 이해해야하기 때문입니다. 

아래는 예시로 제공된 테이블의 카디널리티 예시입니다. 

id       name       location
0         lee         seoul
1        park       pusan
2        choi         seoul
3        park        seoul
4        kim          seoul
5        bae          incheon
6        ahn         seoul
7        lee          seoul
8        lee          seoul
9        kim          seoul 

 

위 테이블에서, id는 중복된 값이 없으므로 카디널리티가 높습니다. name은 중복을 제외한 고유한 값이 6개이므로, id 컬럼에 비해 카디널리티가 낮다고 할 수 있습니다. location은 중복을 제외한 고유한 값이 3개뿐이므로, 카디널리티가 가장 낮습니다. 

참고로, distinct 값이 많다는 것은 중복도가 낮다는 의미입니다. id 컬럼의 경우 distinct 값이 10개입니다. 따라서, distinct 값이 많을수록 중복도가 낮다고 생각할 수 있으며, 

이에 따라 카디널리티가 높다고 볼 수 있습니다. 

반면에 주민등록번호는 테이블에 존재하는 모든 레코드에 고유하게 할당되므로, 주민등록번호의 카디널리티는 테이블의 레코드 수가 됩니다.

오라클과 같은 DBMS에서 카디널리티를 구하는 SQL은 다음과 같이 작성할 수 있습니다.

select count(distinct (deptno)) from employee;

 

선택도(Selectivity)


 

 

선택도는 카디널리티로부터 다음의 공식을 이용해서 계산할 수 있습니다. 

Selectivity = Cardinality / Total Number Of Records

 

선택도는 데이터 집합에서 특정 값을 얼마나 잘 선택할 수 있는지에 대한 지표로 사용됩니다. 

1의 선택도는 모든 값이 고유(유니크)하다는 의미로 생각하시면 됩니다.

그리고, 1이 가장 높은 선택도를 갖습니다. 

 

선택도는 데이터베이스에서 인덱스를 생성할 컬럼을 선택할 때 사용할 수 있습니다. 

만약, 선택도가 높은(1에 가까운) 컬럼에 인덱스를 걸면 데이터가 다 다르므로 인덱스가 특정 레코드를 선택하고 인덱스 사용 효율이 높아집니다. 

반대로 선택도가 낮은 컬럼에 인덱스를 걸게 되면 인덱스를 사용하는 것과 그렇지 않고 검색하는 경우가 비슷해 지고 플랜이 점차 인덱스를 사용하지 않게 될 수 있습니다.

 

 

 

오라클에서 선택도를 구하는 SQL은 아래와 같이 하면 됩니다.

SELECT (distinct_keys / num_rows) AS Selectivity

FROM dba_indexes

WHERE index_name like 'Index_Name' and Owner ='Table_Owner';

 

 

오라클 DBMS에서 제공하는 시스템 카탈로그 뷰 중 'dba_indexes" 뷰를 조회하면 특정 인덱스의 선택도를 확인하실 수 있습니다.

 

데이터베이스에서 인덱스의 선택도를 높이기 위해서는 두 개 이상의 컬럼을 조합해서 인덱스를 거는 것을 고려해 볼 수 있습니다. 

그러면, 조합된 인덱스 키의 카디널리티가 증가하고 결국 선택도도 증가하여 효율이 좋은 인덱스가 됩니다. 

하지만, 인덱스의 키가 두 개 이상의 컬럼으로 구성해야해서 공간 효율성은 나빠집니다. 

추가로, DBMS 별로 인덱스 순서에 따라서 검색 시 인덱스를 사용할 수 없는 경우도 있으므로 이런 부분을 잘 고려해야 합니다. 

 

facebook twitter kakaoTalk kakaostory naver band shareLink