중급

카디널리티 (Cardinality)

컬럼의 고유 값 개수 또는 SQL 단계의 결과 행 수

정의

두 가지 의미로 쓰인다. (1) 컬럼 카디널리티: 그 컬럼에 들어있는 고유 값의 개수. 예를 들어 "성별" 컬럼은 (남, 여, NULL) 3개 정도라 카디널리티가 낮고, "주민번호"는 사람마다 달라서 카디널리티가 높다. (2) 실행계획 카디널리티: 옵티마이저가 추정한 각 단계의 결과 행 수. 실제 행 수와 다르면 옵티마이저가 잘못된 계획을 선택할 수 있다.

왜 중요한가?

카디널리티가 높은 컬럼(고유 값이 많음)은 인덱스 효과가 크고, 낮은 컬럼은 인덱스를 만들어도 거의 효과가 없다. 성별·등급 같은 컬럼에 인덱스를 만들어봐야 결국 절반 이상의 행을 읽게 되어 Full Scan과 다를 게 없기 때문. 인덱스 설계의 첫 판단 기준이다.

틀리기 쉬운 포인트

  • !카디널리티가 낮은 컬럼(성별, 사용/미사용 플래그 등)에 일반 B-tree 인덱스를 만들면 효과 미미.
  • !실행계획의 추정 카디널리티가 실제와 크게 다르면 옵티마이저가 잘못된 계획을 선택합니다.
  • !데이터 분포가 편향된 경우(99%가 같은 값) 단순 카디널리티만으로 판단하면 안 됩니다.

예시

  -- 컬럼별 카디널리티 확인
SELECT COUNT(DISTINCT gender) AS gender_card, COUNT(DISTINCT email) AS email_card, COUNT(*) AS total
FROM users; -- 결과: gender_card=2, email_card=10000, total=10000 -- gender는 카디널리티 매우 낮음 → 인덱스 비효율

성능 포인트

!카디널리티가 낮은 컬럼엔 BITMAP 인덱스가 적합(데이터 웨어하우스). OLTP에선 Bitmap 부적합 — 그냥 인덱스를 안 만드는 게 정답일 때가 많다.

관련 개념

관련 카테고리