반응형

📝선택도 (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

 

 

 

반응형