성능 점검

윈도우 함수 성능 점검 흐름

윈도우 함수는 행 수를 줄이지 않고 각 행 옆에 값을 붙인다. 성능 점검은 함수 이름보다 입력 행 수, 파티션 폭, 정렬 반복, 임시 저장소 사용을 실행 계획에서 확인하는 순서로 진행한다.

1. 입력 행
실제 처리 행 수 / 반복 횟수 윈도우 처리 이전 단계의 실제 행 수.
이 행 수가 정렬, 메모리, 프레임 계산의 기본 배수가 된다.
필터를 안쪽으로 옮기고 필요한 경우 선집계한다.
2. 파티션
최대 그룹 / 집중 키 평균보다 가장 큰 파티션을 본다.
한 고객, 한 부서, 한 날짜가 정렬 병목이 될 수 있다.
기간 조건, 집중 키 분리, 파티션 기준 재검토.
3. 정렬
정렬 뒤 윈도우 처리 반복 서로 다른 OVER 정의가 여러 정렬을 만든다.
같은 행을 여러 정렬 기준으로 처리하면 비용이 커질 수 있다.
창 정의를 통일하고 공유 가능한 ORDER BY를 맞춘다.
4. 스필
외부 정렬 / 임시 저장소 메모리 밖 정렬이나 임시 저장 공간 사용.
정렬량이 메모리 한계를 넘었거나 파티션이 과도하게 크다.
입력 행 축소, 작업 메모리, 인덱스 순서를 함께 점검한다.
5. 인덱스
인덱스 스캔 뒤 정렬 스캔은 했지만 윈도우 순서와 맞지 않는다.
PARTITION 컬럼과 ORDER 컬럼, 방향이 어긋나 있을 수 있다.
필터 컬럼, 파티션 키, 정렬 키 순서를 실행 계획으로 맞춘다.
계획 신호

입력 행과 정렬량이 함께 커지는지 본다

입력 행
많은 입력 행
최대 파티션
큰 파티션
정렬 반복
Sort 반복
스필
임시 저장

한 항목만 보는 대신 입력 행, 큰 파티션, 정렬 반복, 스필을 같은 화면에서 묶어 보면 병목의 위치가 더 빨리 보인다.

계산 경로

WHERE 이후 행이 창 내부 정렬로 들어간다

1 WHERE 통과 행
2 PARTITION BY
3 ORDER BY 정렬
4 프레임 계산
5 원래 행에 값 부착

결과 행 수는 유지된다. 그래서 입력을 줄이지 못하면 이후 단계의 비용도 함께 커질 수 있다.

정렬 맞춤

파티션 키와 정렬 키를 같은 순서로 읽게 만든다

OVER (
  PARTITION BY customer_id
  ORDER BY ordered_at DESC, order_id
)
계획 확인

인덱스가 있어도 Sort가 남으면 순서를 다시 본다

INDEX (
  customer_id,
  ordered_at DESC,
  order_id
)
1
입력 행 줄이기 윈도우 이전 WHERE와 선집계 가능성을 먼저 본다.
2
정렬 공유 여러 OVER 절의 PARTITION/ORDER 정의를 맞춘다.
3
스필 확인 외부 정렬, 임시 저장소 사용, 메모리 경고를 함께 본다.