본문 바로가기
코딩 공부 기록/SQL

[MSSQL] 통계 구성요소(Statistics)

by Murphy0v0 2024. 12. 5.

 

1. 통계(Statistics)란?

테이블이나 인덱스의 데이터 분포를 나타내는 메타데이터로, 쿼리 최적화 도구(Query Optimizer)가 효율적인 실행 계획을 생성하는 데 사용된다. 효율적인 쿼리 실행을 위해 필수적인 요소이다.

 


 

2. 통계의 필요성

https://youtu.be/86x9GC-KTNo?si=Jy_dAVwkdOaBti-V 참고

 

통계는 조회 대상 데이터의 예상되는 행 수를 산정하는 기반이 된다.
그래서 통계 정보가 없을 때의 실행계획에서는 1,258,290건을 예상하고 Hash Join으로 수행했다.

그와 다르게 통계 정보가 있을 떄의 실행계획은 예상 행 수가 6,090건으로 낮게 계산되면서 Merge Join의 실행 계획으로 수행한다.

 

이처럼 통계 정보의 유무에 따라 예상 행 수가 달라지고, 실행 계획에 차이가 발생하게 된다.

 

 


 

3. 통계 구성요소

통계는 헤더, 밀도 벡터, 히스토그램을 포함한다.

 

 

다음은 통계 정보를 확인하기 위한 기본 명령이다.

DBCC SHOW_STATISTICS ({테이블 | 인덱싱 뷰}, {인덱스명 | 통계명}) {WITH 옵션}

 

나는 WITH 옵션 없이 테이블명과 인덱스명만 특정하여 조회해봤다.

DBCC SHOW_STATISTICS (테이블명, 인덱스명)

DBCC SHOW_STATISTICS (테이블명, 인덱스명) 조회 결과

 

실행 결과는 상단부터 통계 헤더, 밀도 벡터, 히스토그램을 나타낸다.

 


1) 헤더(Header)

통계 헤더는 대상 통계의 기본 메타정보를 담고 있는 부분이다.

DBCC SHOW_STATISTICS (테이블명, 인덱스명) WITH STAT_HEADER

 

WITH STAT_HEADER를 덧붙이면 헤더만 조회가 가능하다.

 

  • Name : 통계의 이름
  • Updated : 해당 통계의 마지막 업데이트 시간
  • Rows : 통계 마지막 업데이트 시간 기준 전체 행 수
  • Rows Sampled : 통계 정보가 업데이트 될 때 참고했던 행의 수
  • Steps : 히스토그램의 단계 수
  • Density : 히스토그램 경계 값을 제외한 모든 값에 대한 1/고유 값 
  • Average key length : 전체 열의 데이터들이 가지는 평균 바이트 수(길이)
  • String Index : 문자열 요약 통계가 별도로 저장되어 있음을 표기
  • Filter Expression : 필터링된 인덱스를 사용할 경우에 필터 조건자를 나타냄
  • Unfiltered Rows : 필터 조건에 의해 필터 되지 않은 행의 수

 

2) 밀도 백터(Density Vector)

밀도 벡터는 단일 열 혹은 인덱스에 포함된 모든 열의 선택도를 나타낸다. (데이터 값의 중복 정도)

DBCC SHOW_STATISTICS (테이블명, 인덱스명) WITH DENSITY_VECTOR

  • All density : 1/고유 값
  • Average Length : 열 접두사의 열 값 목록을 저장하기 위한 평균 길이(바이트)
  • Columns : 모든 밀도 및 평균 길이가 표시되는 접두사의 열 이름

선택도(밀도)가 1에 가까울수록 데이터가 많이 중복될 수 있음을 나타낸다.

 

 

3) 히스토그램(Histogram)

통계 개체의 첫 번째 키 열에 있는 데이터 분포를 요약한 그래프이다.

DBCC SHOW_STATISTICS (테이블명, 인덱스명) WITH HISTOGRAM

  • RANGE_HI_KEY : 히스토그램 단계로 지정된 값의 상한 값
  • RANGE_ROWS : 현재 단계와 이전 단계 사이에서 상한 값을 제외한 값들의 행 수
  • EQ_ROWS : 각 단계에서 상한 값과 같은 값을 가진 행의 수
  • DISTINCT_RANGE_ROWS : 현재 단계와 이전 단계 사이에서 상한 값을 제외한 값들의 중복을 제거한 데이터 수
  • AVG_RANGE_ROWS : RANGE_ROWS/DISTINCT_RANGE_ROWS 값. 히스토그램 단계로 지정되지 못한 값의 카디널리티