[F-lab 챌린지 78일차 TIL]

성수데브리·2023년 9월 13일
0

Group By

  • 인덱스를 사용하는 경우
    • 인덱스 스캔 🔺 조건
      • 조인의 드라이빙 테이블에 속한 컬럼으로만 그루핑할 때 해당 컬럼에 인덱스가 있으면 인덱스 차례로 읽으며 그루핑 수행, 결과로 조인 처리
      • 조건을 충족해도 aggregation function 처럼 임시 테이블 사용하는 경우도 있음
      • ⬆️ 인덱스 선택도가 높을수록 좋음
    • 루스 인덱스 스캔 🔺 조건
      • 단일 테이블의 group by 처리에 사용된다.
      • ⬆️ 인덱스 선택도가 낮을수록 좋음
  • 인덱스 사용하지 않는 경우
    • 임시 테이블 사용
      • 인덱스를 전혀 사용하지 못할 때는 group by 절 컬럼들로 구성된 유니크 인덱스를 가진 임시 테이블을 만든다.
      • group by , order by 가 같이 사용되면 명시적으로 정렬 작업을 실행한다.

Distinct 처리

  • 집합 함수와 사용되는 경우
    • 임시 테이블 만든다

      SELECT COUNT(DISTINCT s.salary) FROM employees e, salaries s
      -> 집합 함수의 대상이 되는 컬럼만 기준으로 유니크한 레코드를 가져옴

      인덱스된 컬럼에 대해 distinct 처리 수행 경우 인덱스 풀 스캔, 레인지 스캔으로 최적화 가능

      SELECT COUNT(DISTINCT emp_no) FROM employees;
      SELECT COUNT(DISTINCT emp_no) FROM dept_emp GROUP BY dept_no;
  • 없는 경우
    SELECT DISTINCT emp_no FROM salaries;
    SELECT emp_no FROM salaries GROUP BY emp_no;
  • 인덱스를 사용하지 못할 때는 항상 임시 테이블이 필요

0개의 댓글