DBCC SHOW_STATISTICS(Transact-SQL)

적용 대상:SQL 서버Azure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsMicrosoft Fabric 의 SQL 분석 엔드포인트Microsoft Fabric 의 웨어하우스Microsoft Fabric의 SQL 데이터베이스

이 명령어는 DBCC SHOW_STATISTICS 테이블이나 인덱스 뷰의 최신 쿼리 최적화 통계를 표시합니다. 쿼리 최적화 프로그램은 통계를 사용하여 쿼리 결과의 카디널리티 또는 행 수를 예상하며, 이를 통해 쿼리 최적화 프로그램이 고품질 쿼리 계획을 만들 수 있습니다. 예를 들어 쿼리 최적화 프로그램은 카디널리티 예상치를 통해 쿼리 계획에서 인덱스 스캔 연산자 대신 인덱스 검색 연산자를 선택하여 리소스가 많이 소요되는 인덱스 스캔을 피함으로써 쿼리 성능을 개선할 수 있습니다.

쿼리 최적화 프로그램은 테이블 또는 인덱싱된 뷰에 대한 통계를 통계 개체에 저장합니다. 테이블의 경우 통계 개체는 인덱스 또는 테이블 열의 목록에 생성됩니다. 통계 개체에는 통계에 대한 메타데이터가 있는 헤더, 통계 개체의 첫 번째 키 열에 있는 값의 분포에 대한 히스토그램, 그리고 열 간 상관 관계를 측정하는 밀도 벡터가 포함됩니다. 데이터베이스 엔진은 통계 개체의 일부 데이터를 사용하여 카디널리티 예상치를 계산할 수 있습니다. 자세한 내용은 통계 및 카디널리티 추정(SQL Server)을 참조하세요.

DBCC SHOW_STATISTICS는 통계 개체에 저장된 데이터를 바탕으로 헤더, 히스토그램 및 밀도 벡터를 표시합니다. 이 구문을 사용하면 대상 인덱스 이름, 통계 이름 또는 열 이름과 함께 테이블 또는 인덱싱된 뷰를 지정할 수 있습니다.

이전 버전 SQL Server의 중요한 업데이트:

  • SQL Server 2012(11.x) 서비스 팩 1부터 sys.dm_db_stats_properties 동적 관리 뷰를 사용하여 비 증분 통계에 대한 통계 개체에 포함된 헤더 정보를 프로그래밍 방식으로 검색할 수 있습니다.

  • SQL Server 2014(12.x) 서비스 팩 2 및 SQL Server 2012(11.x) 서비스 팩 1부터 sys.dm_db_incremental_stats_properties 동적 관리 뷰를 사용하여 증분 통계에 대한 통계 개체에 포함된 헤더 정보를 프로그래밍 방식으로 검색할 수 있습니다.

  • SQL Server 2016(13.x) 서비스 팩 1 CU 2부터 sys.dm_db_stats_histogram을 사용하여 통계 개체에 포함된 히스토그램 정보를 프로그래밍 방식으로 검색할 수 있습니다.

  • 이 구문은 Azure Synapse Analytics의 서버리스 SQL 풀에서 지원되지 않습니다.

  • Microsoft Fabric Data Warehouse의 통계에 대한 자세한 내용은 통계를 참조하세요.

Transact-SQL 구문 표기 규칙

구문

패브릭의 SQL Server, Azure SQL Database 및 SQL 데이터베이스에 대한 구문:

DBCC SHOW_STATISTICS ( table_or_indexed_view_name , target )
[ WITH [ NO_INFOMSGS ] < option > [ , ...n ] ]
< option > ::=
    STAT_HEADER | DENSITY_VECTOR | HISTOGRAM | STATS_STREAM
[ ; ]

Azure Synapse Analytics 및 Microsoft Fabric의 Warehouse 구문:

DBCC SHOW_STATISTICS ( table_name , target )
    [ WITH { STAT_HEADER | DENSITY_VECTOR | HISTOGRAM } [ , ...n ] ]
[ ; ]

인수

table_or_indexed_view_name

통계 정보를 표시할 테이블 또는 인덱싱된 뷰의 이름입니다.

테이블 이름

표시할 통계가 들어 있는 테이블의 이름입니다. 테이블은 외부 테이블일 수 없습니다.

target

통계 정보를 표시할 인덱스, 통계 또는 열의 이름입니다. 대상은 대괄호, 작은 따옴표, 큰 따옴표 또는 따옴표 없음으로 묶입니다.

  • target이 테이블 또는 인덱싱된 뷰의 기존 인덱스 또는 통계 이름인 경우 이 대상에 대한 통계 정보가 반환됩니다.
  • 대상이 기존 열의 이름이고 이 열에 자동으로 생성된 통계 개체가 있는 경우 해당 자동 생성된 통계에 대한 정보가 반환됩니다.

열 대상에 대해 자동으로 생성된 통계가 없으면 오류 메시지 2767이 반환됩니다.

Azure Synapse Analytics에서는 target이 열명이 될 수 없습니다.

Microsoft Fabric 의 Warehouse에서 대상 은 단일 열 히스토그램 통계의 이름 또는 열일 수 있습니다. 대상에 열 이름을 사용하는 경우 이 명령은 자동으로 생성된 히스토그램 통계에 대한 배포 정보만 반환합니다. 수동으로 만든 히스토그램 통계에 대한 정보를 보려면 통계 이름을 대상으로 지정합니다.

NO_INFOMSGS

심각도가 0에서 10 사이인 모든 정보 메시지를 표시하지 않습니다.

STAT_HEADER | DENSITY_VECTOR | 히스토그램 | STATS_STREAM [ , n ]

이 옵션 중 하나 이상을 지정하면 문에서 반환하는 결과 집합이 지정한 옵션으로 제한됩니다. 옵션을 지정하지 않으면 모든 통계 정보가 반환됩니다.

STATS_STREAM은 정보를 제공하기 위해서만 확인됩니다. 지원 안 됨 향후 호환성은 보장되지 않습니다.

결과 집합

다음 표에서는 STAT_HEADER를 지정한 경우 결과 집합에 반환되는 열을 설명합니다.

열 이름 설명
Name 통계 개체의 이름입니다.
Updated 통계가 마지막으로 업데이트된 날짜와 시간입니다. STATS_DATE 함수를 사용하여 이 정보를 검색할 수도 있습니다. 자세한 내용은 이 페이지의 주의 섹션을 참조하세요.
Rows 통계가 마지막으로 업데이트되었을 때 테이블 또는 인덱싱된 뷰의 전체 행 수입니다. 통계가 필터링되거나 필터링된 인덱스에 해당하는 경우 행 수가 테이블의 행 수보다 적을 수 있습니다. 자세한 내용은 통계를 참조하세요.
Rows Sampled 통계 계산을 위해 샘플링된 전체 행 수입니다. 만약 이면 Rows Sampled<Rows, 표시되는 히스토그램과 밀도 결과는 샘플링된 행을 기반으로 추정한 값입니다.
Steps 히스토그램의 총 단계 수입니다. 각 단계의 범위는 열 값에서 상한 열 값까지입니다. 히스토그램 단계는 통계의 첫 번째 키 열에 정의됩니다. 최대 단계 수는 200개입니다.
Density 히스토그램 경계 값을 제외하고 통계 개체의 첫 번째 키 열에 있는 모든 값에 대해 1/ 고유 값 으로 계산됩니다. 이 Density 값은 쿼리 옵티마이저에서 사용하지 않으며, SQL Server 2008(10.0.x) 이전 버전과의 하위 호환성을 위해 표시됩니다.
Average Key Length 통계 개체의 키 열에 있는 모든 값에 대한 값당 평균 바이트 수입니다.
String Index 예는 통계 객체가 연산자를 사용하는 LIKE 쿼리 술어의 기수 추정치를 개선하기 위해 문자열 요약 통계를 포함함을 나타냅니다; 예를 들어, WHERE ProductName LIKE '%Bike'. 문자열 요약 통계는 히스토그램과 별도로 저장되며, char,varchar, nvarchar, nvarchar, varchar(max),nvarchar(max), nvarchar(max),텍스트 또는 ntext 유형 중 char와 varchar 열일 때는 통계 객체의 첫 번째 키 열에 생성됩니다. 단, char 와 varchar 열은 UTF-8 콜레이션을 사용합니다.
Filter Expression 통계 개체에 포함된 테이블 행의 하위 집합에 대한 조건자입니다. NULL = 필터링되지 않은 통계입니다. 필터링된 조건자에 대한 자세한 내용은 필터링된 인덱스 만들기를 참조하세요. 필터링된 통계에 대한 자세한 내용은 통계를 참조하세요.
Unfiltered Rows 필터 식을 적용하기 전 테이블에 있는 전체 행 수입니다. Filter 식이 NULL이면 Unfiltered Rows는 Rows와 같습니다.
Persisted Sample Percent 샘플링 비율을 명시적으로 지정하지 않는 통계 업데이트에 사용되는 지속형 샘플 백분율입니다. 값이 0이면 이 통계에 대해 지속 된 샘플 백분율이 설정되지 않습니다.

적용 대상: SQL Server 2016 (13.x) 서비스 팩 1 CU 4 및 이후 버전.

다음 표에서는 지정된 경우 DENSITY_VECTOR 결과 집합에서 반환되는 열에 대해 설명합니다.

열 이름 설명
All Density 밀도는 1/ 고유 값입니다. 결과에는 통계 개체에 있는 각 열 접두사의 밀도가 한 행씩 표시됩니다. 고유 값은 행별 및 열 접두사별 열 값의 고유한 목록입니다. 예를 들어 통계 개체가 키 열 (A, B, C)를 포함하는 경우 결과에서 밀도는 이러한 각 열 접두사의 고유 값 목록인 (A), (A,B) 및 (A, B, C)로 보고됩니다. 접두사 (A, B, C)를 사용하면 이러한 각 목록은 다음과 같은 고유 값 목록입니다. (3, 5, 6), (4, 4, 6), (4, 5, 6), (4, 5, 7). 접두사 (A, B)를 사용하면 동일한 열 값은 고유 값 목록 (3, 5), (4, 4) 및 (4, 5)를 가집니다.
Average Length Average length, (bytes) 단위로 열의 열값 목록을 저장합니다. 예를 들어 목록 (3, 5, 6)의 각 값에 4바이트가 필요한 경우 길이는 12바이트입니다.
Columns 와 All density 가 붙은 접두사 Average length 의 열명이 표시됩니다.

다음 표에서는 옵션이 지정된 경우 결과 집합에서 반환되는 열에 대해 HISTOGRAM 설명합니다.

열 이름 설명
RANGE_HI_KEY 히스토그램 단계의 상한 열 값입니다. 열 값은 키 값이라고도 합니다.
RANGE_ROWS 상한을 제외한 히스토그램 단계 내에 열 값이 있는 예상 행 수입니다.
EQ_ROWS 히스토그램 단계에서 상한과 열 값이 동일한 예상 행 수입니다.
DISTINCT_RANGE_ROWS 상한을 제외한 히스토그램 단계 내에 고유한 열 값이 있는 예상 행 수입니다.
AVG_RANGE_ROWS 히스토그램 단계 내에 중복된 열 값이 있는 평균 행 수(상한 제외)입니다. 0 DISTINCT_RANGE_ROWSAVG_RANGE_ROWSRANGE_ROWS보다 크면 .DISTINCT_RANGE_ROWS 0 DISTINCT_RANGE_ROWS 이면 AVG_RANGE_ROWS 히스토그램 단계에 대해 1을 반환합니다.

설명

통계 업데이트 날짜는 히스토그램 및 밀도 벡터와 함께 메타데이터가 아닌 통계 BLOB 개체에 저장됩니다. 통계 데이터를 생성하기 위해 데이터를 읽지 않으면 통계 Blob이 만들어지지 않고 날짜를 사용할 수 없으며 열이 updated 됩니다 NULL. 조건자가 행을 반환하지 않는 필터링된 통계 또는 빈 새 테이블의 경우입니다.

쿼리 옵티마이저가 특정 쿼리를 컴파일할 때 어떤 통계가 로드되었는지 확인하려면, 쿼리의 실제 실행 계획 XML 내 요소를 검사 StatisticsInfo 하세요. 그 원소의 속성은 Statistics 의 target인자입니다DBCC SHOW_STATISTICS. 자세한 내용은 쿼리 옵티마이저가 사용한 통계 확인을 참조하세요.

히스토그램

히스토그램은 데이터 집합에서 각 고유 값의 발생 빈도를 측정합니다. 쿼리 최적화 프로그램은 행을 통계적으로 샘플링하거나 테이블 또는 뷰의 모든 행에 대해 전체 검색을 수행하는 방법으로 열 값을 선택하여 통계 개체의 첫 번째 키 열에 있는 열 값에 대한 히스토그램을 계산합니다. 샘플링된 행 집합에서 히스토그램을 만드는 경우 행 수 및 고유 값 수에 대해 저장된 합계는 예상치이며 정수일 필요는 없습니다.

쿼리 최적화 프로그램에서는 히스토그램을 만들기 위해 열 값을 정렬하고 고유한 각 열 값과 일치하는 값의 수를 계산한 다음 열 값을 최대 200개의 연속적인 히스토그램 단계로 집계합니다. 각 단계의 범위는 열 값에서 상한 열 값까지입니다. 범위는 경계 값 자체를 제외하고 경계 값 사이의 모든 가능한 열 값을 포함합니다. 정렬된 열 값 중 가장 낮은 값은 첫 번째 히스토그램 단계의 상한 값입니다.

다음 다이어그램에서는 6단계의 히스토그램을 보여 줍니다. 첫 번째 상한 값 왼쪽의 영역이 1단계입니다.

샘플링된 열 값에서 히스토그램을 계산하는 방법의 다이어그램

각 히스토그램 단계를 살펴보면 다음과 같습니다.

  • 굵은 선은 상한 경계값(RANGE_HI_KEY)과 그 횟수(EQ_ROWS)를 나타냅니다
  • 왼쪽의 RANGE_HI_KEY 실선 영역은 각 열 값의 범위와 각 열 값이 나타나는 평균 횟수()를 나타냅니다.AVG_RANGE_ROWS 첫 번째 히스토그램 단계의 AVG_RANGE_ROWS는 항상 0입니다.
  • 점선은 범위 ()DISTINCT_RANGE_ROWS 내 서로 다른 값의 총 수와 범위 내 값 총 수를 추정하는 데 사용된 샘플링 값을 나타냅니다.RANGE_ROWS 쿼리 옵티마이저는 와 를 사용 RANGE_ROWS 해 계산 DISTINCT_RANGE_ROWS 하며, 샘플링된 값을 저장하지 AVG_RANGE_ROWS 않습니다.

쿼리 최적화 프로그램은 통계적 중요성에 따라 히스토그램 단계를 정의합니다. 또한 히스토그램의 단계 수를 최소화하면서 경계 값 간의 차이를 최대화하기 위해 최대 차이 알고리즘을 사용합니다. 최대 단계 수는 200개입니다. 히스토그램 단계 수는 경계 지점이 200개 미만인 열에서도 고유 값의 개수보다 적을 수 있습니다. 예를 들어 100개의 고유 값을 가진 열의 히스토그램에 100개 미만의 경계 지점이 있을 수 있습니다.

밀도 벡터

쿼리 최적화 프로그램은 같은 테이블 또는 인덱싱된 뷰에서 여러 열을 반환하는 쿼리의 카디널리티 예상치 정확도를 높이기 위해 밀도를 사용합니다. 밀도 벡터는 통계 개체에 있는 각 열 접두사당 한 개의 밀도를 포함합니다. 예를 들어 통계 개체에 CustomerId, ItemId, Price 키 열이 있는 경우 다음의 각 열 접두사에 대해 밀도가 계산됩니다.

열 접두사 밀도 계산 기준
(CustomerId) CustomerId의 값이 일치하는 행
(CustomerId, ItemId) CustomerId 및 ItemId의 값이 일치하는 행
(CustomerId, ItemId, Price) CustomerId, ItemId, Price의 값이 일치하는 행

제한 사항

DBCC SHOW_STATISTICS 는 공간 인덱스 또는 메모리 최적화 columnstore 인덱스에 대한 통계를 제공하지 않습니다.

SQL Server 및 SQL Database 권한

통계 개체를 보려면 사용자에게 테이블에 대한 SELECT 권한이 있어야 합니다.

명령을 실행하기에 충분한 사용 권한에 대한 SELECT 요구 사항은 다음과 같습니다.

  • 사용자는 통계 개체의 모든 열에 대한 권한이 있어야 합니다.
  • 사용자는 필터 조건의 모든 열에 대한 권한이 있어야 합니다(있는 경우).
  • 테이블에 행 수준 보안 정책이 있을 수 없습니다.
  • 통계 개체 내의 열이 사용 권한 외에도 SELECT 동적 데이터 마스킹 규칙으로 마스킹되는 경우 사용자에게 권한이 있거나 db_ddladminUNMASK멤버여야 합니다.

SQL Server 2012(11.x) 서비스 팩 1 이전 버전에서는 사용자가 테이블을 소유해야 합니다. 또는 사용자가 sysadmin 고정 서버 역할, db_owner 고정 데이터베이스 역할 또는 db_ddladmin 고정 데이터베이스 역할의 멤버여야 합니다. 이전 SQL Server 2012(11.x) 서비스 팩 1 동작으로 동작을 다시 변경하려면 추적 플래그 9485를 사용합니다.

Microsoft Fabric의 Microsoft Fabric Data Warehouse 및 SQL 분석 엔드포인트에 대한 권한

패브릭 데이터 웨어하우스 또는 SQL 분석 엔드포인트에서 통계 개체를 보려면 사용자에게 테이블에 대한 사용 권한 또는 뷰어 패브릭 작업 영역 역할의 멤버 또는 더 높은 역할 멤버 자격이 있어야 합니다 SELECT .

Permissions for Azure Synapse Analytics

DBCC SHOW_STATISTICS에는 SELECT sysadmin 고정 서버 역할, db_owner 고정 데이터베이스 역할 또는 db_ddladmin 고정 데이터베이스 역할의 멤버 자격이 필요합니다.

Azure Synapse Analytics 의 한계 및 제한

DBCC SHOW_STATISTICS는 Shell 데이터베이스의 제어 노드 수준에 저장된 통계를 표시합니다. 컴퓨팅 노드의 SQL Server에서 자동으로 생성하는 통계는 표시되지 않습니다.

DBCC SHOW_STATISTICS 는 외부 테이블에서 지원되지 않습니다.

Microsoft Fabric DBCC SHOW_STATISTICS 의 Warehouse에서는 통계가 아닌 ACE-* 히스토그램 통계에 대한 결과만 표시합니다.

예: 패브릭의 SQL Server, Azure SQL Database 및 SQL 데이터베이스

A. 모든 통계 정보 반환

다음 예시는 AdventureWorks2025 데이터베이스 내 테이블 인덱스 AK_Address_rowguid 에 대한 Person.Address 모든 통계 정보를 보여줍니다.

DBCC SHOW_STATISTICS ("Person.Address", AK_Address_rowguid);
GO

B. HISTOGRAM 옵션 지정

이렇게 하면 Customer_LastName에 대해 표시된 통계 정보가 HISTOGRAM 데이터로 제한됩니다.

DBCC SHOW_STATISTICS ("dbo.DimCustomer", Customer_LastName) WITH HISTOGRAM;
GO

예제: Azure Synapse Analytics

C. 하나의 통계 개체 내용 표시

다음 예시는 통계 객체를 생성한 후 AdventureWorks2012 샘플 데이터베이스의 테이블에 DimCustomer 통계 내용을 Customer_LastName 표시합니다.

-- Uses AdventureWorks2012
--First, create a statistics object
CREATE STATISTICS Customer_LastName
ON AdventureWorks2012.dbo.DimCustomer (LastName);
GO
DBCC SHOW_STATISTICS ("dbo.DimCustomer", Customer_LastName);
GO

결과는 헤더, 밀도 벡터 및 히스토그램 일부를 보여줍니다.

DBCC SHOW_STATISTICS 결과를 보여 주는 스크린샷