결론부터
👉 중복이 없는 컬럼이어도 DISTINCT를 쓰면 실행 계획은 달라질 수 있고, 보통은 “불리”해집니다.
👉 단, DB가 중복이 없다는 걸 플랜 단계에서 확신할 수 있으면 차이가 거의 없을 수도 있습니다.
SQL:
SELECT DISTINCT col
FROM table;
DB 입장에서는 반드시 이걸 보장해야 합니다.
그래서 내부적으로는 보통 아래 중 하나가 추가됩니다.
→ SORT
→ TABLE ACCESS / INDEX SCAN
→ HASH UNIQUE (또는 HASH AGG)
→ TABLE ACCESS / INDEX SCAN
📌 이 단계 자체가 비용(cost)을 만듭니다.
SELECT col
FROM table;
👉 플랜이 훨씬 단순해짐
여기서 중요한 포인트 👇
이런 경우:
SELECT DISTINCT pk_col FROM table;
👉 옵티마이저가 판단:
“어차피 중복 없음 → DISTINCT 의미 없음”
📌 이러면 실제 실행 계획에서
⚠️ 단, DB 종류/버전에 따라 다름 (Oracle, MySQL, PostgreSQL 다름)
이때는:
👉 데이터 많을수록 체감 성능 차이 큼
INDEX RANGE SCAN idx_col
→ RETURN ROWS
INDEX RANGE SCAN idx_col
→ SORT UNIQUE
→ RETURN ROWS
📌 SORT UNIQUE 하나 들어가는 순간:
SELECT DISTINCT a.col
FROM a
JOIN b ON ...
👉 이건 진짜 성능 차이 큼
(“이미 늦었다” 상태에서 중복 제거)
“실제 중복이 없어도 DISTINCT는 중복 제거 연산을 유발할 수 있고,
DB가 유니크함을 보장하지 못하면 실행 계획과 성능 차이가 크게 난다.”

| mysql 테이블 컬럼, 인덱스 구조 보는 명령어는? (0) | 2025.12.20 |
|---|---|
| /*+USE_IDX ORDERED*/ /*+USE_NL ORDERED*/ /*+USE_IDX*/ 인덱스 힌트 차이 (0) | 2025.12.17 |
| MySQL 기준 테이블 파티션 partition 생성 예제 코드설명 (0) | 2025.12.05 |
| 데이터베이스 테이블 파티션 partition 개념은? (0) | 2025.12.05 |
| 데이터 삭제 delete / truncate / partition drop 쓰는 방법 차이 (0) | 2025.12.05 |