중급
카디널리티 (Cardinality)
컬럼의 고유 값 개수 또는 SQL 단계의 결과 행 수
정의
왜 중요한가?
틀리기 쉬운 포인트
- !카디널리티가 낮은 컬럼(성별, 사용/미사용 플래그 등)에 일반 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 부적합 — 그냥 인덱스를 안 만드는 게 정답일 때가 많다.