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

2024. 12. 5. 09:53·코딩 공부 기록/SQL

 

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 값. 히스토그램 단계로 지정되지 못한 값의 카디널리티

'코딩 공부 기록 > SQL' 카테고리의 다른 글

[MSSQL] 격리 수준 (ISOLATION)  (2) 2024.12.09
[MSSQL] SQL Server 잠금(LOCK)의 종류  (1) 2024.12.06
[SQL] 인덱스 조각화  (0) 2024.11.25
[MSSQL] 인덱스의 스캔 방식  (2) 2024.11.22
[MSSQL] 클러스터 인덱스(Clustered Index)와 비 클러스터 인덱스(Non Clustered Index)  (0) 2024.11.22
'코딩 공부 기록/SQL' 카테고리의 다른 글
  • [MSSQL] 격리 수준 (ISOLATION)
  • [MSSQL] SQL Server 잠금(LOCK)의 종류
  • [SQL] 인덱스 조각화
  • [MSSQL] 인덱스의 스캔 방식
Murphy0v0
Murphy0v0
코딩 공부 / 일상 / 여행 / 자유 글
  • Murphy0v0
    주니어 개발자 Murphy의 코딩 저장소
    Murphy0v0
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 여행
      • 코딩테스트
        • 알고리즘
      • 코딩 공부 기록
        • C#
        • SQL
        • Java
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    코딩테스트연습
    클러스터형인덱스
    MSSQL
    오블완
    넌클러스터
    osgi framework
    코딩테스트java
    인덱스
    mssql 로컬
    mssql 로컬 서버
    db table scan
    Java
    mssql튜닝
    DB인덱스
    mssql테이블복제
    sql 잠금
    티스토리챌린지
    sql 튜닝
    대용량 데이터 삭제
    인덱스조각화
    mssqllock
    프로그래머스
    인덱스 튜닝
    sql server developer
    코딩테스트
    sql테이블복사
    MSSQL 인덱스
    mssql 메모리
    코딩테스트준비
    프로그래머스 코딩테스트
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Murphy0v0
[MSSQL] 통계 구성요소(Statistics)
상단으로

티스토리툴바