📝선택도 (Selectivity)
특정 조건(WHERE절 등)을 적용했을 때 전체 데이터 중 “얼마나 적은 비율”이 선택되는지 나타내는 값
📝드라이빙 테이블 (Driving Table) & 드리븐 테이블 (Driven Table)
드라이빙 테이블 (DrivingTable)

Driving table은 조인(Join)을 수행할 때 기준이 되는 테이블을 말합니다. (조인 순서를 결정할 때 가장 먼저 읽기 시작하는 테이블)
보통 선택도(Selectivity)가 높아서 결과 행(row)이 적은 테이블이 드라이빙 테이블이 되며 가장 이상적이다. (연산 최적화)
for each row in Driving Table: ← 외부 루프 (드라이빙)
find matching rows in Driven Table ← 내부 루프 (드리븐)
일반적으로 로직이 이렇게 돌아가기 때문에 드라이빙이 100개면 드리븐 테이블이 아무리 커도 인덱스가 있어서 특정 row에 접근해 매핑시키지만 만약 드라이빙이 1억개면 드리븐 테이블이 작아도 1억번은 반복해야하기 때문에 극심한 손해가 있습니다.
(100*1억과 1억*100은 반복 숫자는 똑같지만 인덱스로 찾아가면 1억개의 데이터를 인덱스로 찾는게 더 좋습니다. → 그래서 인덱스가 드리븐 테이블에 필요)
드리븐 테이블 (Driven Table)
Driving Table의 결과를 기준으로 조인해서 읽혀지는 대상 테이블 (Driving Table의 키 값을 이용해 반복적으로 접근)
드라이빙 테이블 기반으로 드리븐 테이블 조회하기 때문에 드리븐 테이블 조인 컬럼에 인덱스가 있어야 빨리 찾을 수 있다.
📝CPU 브랜치 (CPU Branch) & 브랜치 예측
CPU에서 프로그램의 실행 흐름이 분기되는 지점(branch)으로 실행해야 할 다음 명령어의 주소가 달라지는 순간이 바로 브랜치입니다.
브랜치가 있으면 CPU는 다음에 어떤 명령을 미리 가져올지 알 수 없게 됩니다.
그래서 CPU는 branch predictor(분기 예측기)를 사용해 조건이 참일지? 거짓일지? 점프할지? 하지 않을지? 를 미리 예측합니다.
📝브랜치 미스프레딕션 (Branch Misprediction)
예측이 틀리면 CPU는 이미 로드해둔 명령어들을 모두 폐기하고 초기화하는 과정에서 큰 성능 손실이 일어나게 됩니다.
사용자는 SQL을 작성하지만 DB 엔진 내부에서는 아래 단계를 거칩니다
SQL → 실행 계획 → 연산자 코드 → CPU 명령어 실행
여기서 CPU는 반복(loop), 조건 검사, 비교 등을 수행하는데 이 과정에서 브랜치(branch)가 매우 많습니다.
- 인덱스 탐색 시 비교 연산(branch)
- WHERE 조건 평가(branch)
- 조인 매칭 여부 확인(branch)
- 해시 테이블 탐색 시 충돌 처리(branch)
즉, 쿼리 성능의 상당 부분이 CPU 브랜치의 효율에 의해 좌우됩니다.
🔗 참고 및 출처
https://insight-bgh.tistory.com/500