Today
Total
KoreanEnglishFrenchGermanJapaneseSpanishChinese (Simplified)
관리 메뉴

DB & AWS Knowledge

카디널리티 (Cardinality), 선택도 (Selectivity) 본문

DB 관련 지식/DB 기본 개념

카디널리티 (Cardinality), 선택도 (Selectivity)

`O` 2024. 5. 15. 14:57
728x90
반응형

해당 페이지에서는 선택도, 카디널리티 개념에 대해서 다룬다.

 

이 페이지는 아래의 관련 블로그 글들을 참조한다.

 

[1] https://velog.io/@jduck1024/%EC%B9%B4%EB%94%94%EB%84%90%EB%A6%AC%ED%8B%B0-VS-%EC%84%A0%ED%83%9D%EB%8F%84-feat.-NDV-Density

 

[2] https://velog.io/@yangsijun528/%EC%B9%B4%EB%94%94%EB%84%90%EB%A6%AC%ED%8B%B0-%EC%84%A0%ED%83%9D%EB%8F%84-%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80

 

[3] https://yooloo.tistory.com/54

 

[4] https://yurimkoo.github.io/db/2020/03/14/db-index.html

 

[5] https://developer.couchbase.com/tutorial-understanding-cardinality-and-selectivity

 

 

카디널리티

 

특정 데이터 집합에서 (DB 에서는 특정 테이블 컬럼) 고유값이 얼마나 존재하는지 (Unique) 보여주는 값이다.

일반적으로 이를 설명할 때, 예시로 들 수 있는 항목들은 아래와 같다.

 

- 성별

 

남, 녀 두개만 존재하므로 카디널리티는 2다

 

- 사번

 

특정 회사에서 부여되는 각 사번 또한 고유 한 값이고 이 때는 직원수가 카디널리티 값이다.

(500 명이 각각 고유 사번을 받을 시, 이에 따른 고유 값은 500개 이므로 카디널리티도 500이다)

 

이 때, 카디널리티가 0 일 경우가 있다.

카디널리티가 0 이라면, 데이터를 기입할 수 있는 공간에 어떠한 데이터가 기입되지 않았다는 것을 의미 하므로

DB 개념에서는 데이터 집합 또는 테이블 컬럼 공간이 모두 NULL 임을 뜻한다.

 

일반적으로 이를 SQL 로 조회시에는 distinct 를 사용한다.

 

 

선택도

 

선택도는 주어진 데이터들 사이에서 고유값들이 얼마나 있는지에 대한 척도다.

산출된 특정 데이터 분포의 카디널리티를 총 데이터 개수로 나눈 값이다.

, '선택도 = 카디널리티 / 전체 데이터 개수 * 100' 이다. (% 단위)

 

예를 들어, 학생수가 20명인 특정 학급에서 성별을 기준으로 선택도를 산출하면 2/20 * 100 이 되어 10% 가 된다.

 

 

카디널리티, 선택도를 통한 중복 정도의 산정 및 이에 대한 중요성 

 

DB 영역에서 이 두개의 개념을 통하여 중복 정도를 산출하고 이에 따라 어떤 컬럼에 인덱스를 생성하는 것이 성능적으로 유리한지를 미리 파악 할 수 있다.

 

일반적으로 인덱스를 추가할 대상 컬럼들을 비교 중, 카디널리티가 높은 컬럼이 인덱스를 추가하기 좋은 컬럼 대상이다.

카디널리티가 높다는 것은 그만큼 고유 값이 많아서 각 데이터 간 중복되는 데이터의 개수가 줄어들어 조건절을 통한 데이터를 조회 시, 필요한 데이터 및 조회되는 데이터의 비율이 줄어들기 때문이다.

 

문제는 선택도다. 위의 선택도 공식을 따르면 카디널리티와 선택도는 비례관계이기에

이론상으로는 카디널리티가 높을수록 선택도 또한 높아져서 선택도가 높을수록 인덱스를 추가하기 좋은 컬럼 대상이 괸다. 그러나 위의 다수 참조 링크들을 보면 특정 컬럼의 선택도 값이(% 비율) 낮을 수록 인덱스 사용이 용이한 컬럼으로 설명된다.

 

이는 DB 에서는 전체 데이터중에서 조건절에 (WHERE) 의해 조회될 것으로 예상되는 레코드의 비율(%) 개념으로 의미 반영이 되기 대문이다. 문제는 이 의미 반영과 실제 선택도 공식간에 상이한점이 생기게 된다.

 

예를 들어, 위에서 설명된 사번은 각 직원들마다 고유한 값을 가지므로 이를 선택도 공식으로 계산하게 되면

500/500 * 100 (%) = 100% 가 되어서 DB 에서 통용되는 의미로 해석하면 최악의 컬럼이 되게 된다

 

그러나, 조건절로 조회되는 레코드는 무조건 1건이 나오기에 의미 반영적인 해석으로 보면 1/500 가 되어 (0.002 %) 인덱스를 추가하기 매우 유용한 컬럼으로 해석된다.

 

그래서 DB 의 관점에서 선택도의 의미를 내놓기 위해서는 이론적인 공식에 분포의 개념을 추가로 반영해야한다.

[4] 번 글이 이를 매우 잘 보여주며 여기에 추가적인 예를 설명하면 이와 같다.

 

위에서 설명한 사번은 분포 개념을 적용 해 보면 한명씩 한개의 값을 고유하게 가지므로 이론으로만 보면

인덱스 추가 컬럼 대상으로는 좋지 않지만, 분포 개념을 적용하면 한명씩 고유 값을 가지므로 DB 에서 조회시에도 깔끔하게 한개의 데이터 (row) 만 나오기에 인덱스를 추가하기 최적의 컬럼이다.

 

성별은 반대로 이론적으로보면 카디널리티가 2밖에 되지 않아 선택도 값이 낮게 산정되어 인덱스 추가 컬럼으로 좋게 보일 수 있으나 분포의 개념을 확장해서 보면 특정 조직에서 성별은 5:5 / 6:4 / 7:3 등의 비율을 가지므로 DB 조회 시에도 조회가 필요한 데이터 이외에 다른 데이터들까지 추가로 조회가 될 가능성이 높아지기에 인덱스를 추가하는게 좋은 컬럼인지는 추가적인 고려를 할 필요가 있다.

 

이와 같이 인덱스 추가 대상 컬럼을 산정 시에는 위의 개념들을 종합하여 어떤 컬럼이 최적의 컬럼인지 고려를 해야한다.

 

물론, 실무에서는 인덱스를 추가 시, scan 할 컬럼을 복합적으로 넣어서 DB 가 좀 더 정밀하게 필요한 데이터만 추출 할 수 있도록 설정한다. (and 조건으로 조회 대상을 줄이는 개념)

반응형

'DB 관련 지식 > DB 기본 개념' 카테고리의 다른 글

Dead Lock 개념  (0) 2024.01.24
latch, mutex, enqueue  (0) 2023.06.16
Physical Replication 과 Logical Replication  (0) 2023.05.12
관제, 모니터링 (Monitoring)  (0) 2021.06.03
리두 로그 (Redo Log)  (0) 2021.04.06
Comments