UPDATE STATISTICS(Transact-SQL)
적용 대상: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System(PDW) Microsoft Fabric의 SQL 분석 엔드포인트 Microsoft Fabric의 웨어하우스
테이블 또는 인덱싱된 뷰에서 쿼리 최적화 통계를 업데이트합니다 . 기본적으로 쿼리 최적화 프로그램은 이미 필요할 때 통계를 업데이트하여 쿼리 계획을 향상시킵니다. 하지만 경우에 따라 사용자가 UPDATE STATISTICS
또는 sp_updatestats 저장 프로시저를 사용하여 기본 업데이트 주기보다 더 자주 통계를 업데이트하여 쿼리 성능을 향상시킬 수 있습니다.
통계를 업데이트하면 쿼리가 최신 통계로 컴파일되지만 임의의 프로세스를 통해 통계를 업데이트하면 쿼리 계획이 자동으로 다시 컴파일될 수 있습니다. 쿼리 계획 향상과 쿼리 재컴파일 소요 시간 간의 성능 균형을 유지해야 하므로 통계를 너무 자주 업데이트하지 않는 것이 좋습니다. 구체적인 성능 균형 유지의 정도는 애플리케이션에 따라 달라집니다. UPDATE STATISTICS
는 통계를 작성하기 위해 tempdb
를 사용하여 행 샘플을 정렬할 수 있습니다.
참고 항목
Microsoft Fabric의 통계에 대한 자세한 내용은 Microsoft Fabric의 통계를 참조하세요.
Syntax
-- Syntax for SQL Server and Azure SQL Database
UPDATE STATISTICS table_or_indexed_view_name
[
{
{ index_or_statistics__name }
| ( { index_or_statistics_name } [ ,...n ] )
}
]
[ WITH
[
FULLSCAN
[ [ , ] PERSIST_SAMPLE_PERCENT = { ON | OFF } ]
| SAMPLE number { PERCENT | ROWS }
[ [ , ] PERSIST_SAMPLE_PERCENT = { ON | OFF } ]
| RESAMPLE
[ ON PARTITIONS ( { <partition_number> | <range> } [, ...n] ) ]
| <update_stats_stream_option> [ ,...n ]
]
[ [ , ] [ ALL | COLUMNS | INDEX ]
[ [ , ] NORECOMPUTE ]
[ [ , ] INCREMENTAL = { ON | OFF } ]
[ [ , ] MAXDOP = max_degree_of_parallelism ]
[ [ , ] AUTO_DROP = { ON | OFF } ]
] ;
<update_stats_stream_option> ::=
[ STATS_STREAM = stats_stream ]
[ ROWCOUNT = numeric_constant ]
[ PAGECOUNT = numeric_contant ]
-- Syntax for Azure Synapse Analytics and Parallel Data Warehouse
UPDATE STATISTICS [ schema_name . ] table_name
[ ( { statistics_name | index_name } ) ]
[ WITH
{
FULLSCAN
| SAMPLE number PERCENT
| RESAMPLE
}
]
[;]
-- Syntax for Microsoft Fabric
UPDATE STATISTICS [ schema_name . ] table_name
[ ( { statistics_name } ) ]
[ WITH
{
FULLSCAN
| SAMPLE number PERCENT
}
]
[;]
참고
이 구문은 Azure Synapse Analytics의 서버리스 SQL 풀에서 지원되지 않습니다.
인수
table_or_indexed_view_name
통계 개체를 포함하는 테이블 또는 인덱싱된 뷰의 이름입니다.
index_or_statistics_name 또는 statistics_name | index_name 또는 statistics_name
통계를 업데이트할 인덱스 이름 또는 업데이트할 통계의 이름입니다. index_or_statistics_name 또는 statistics_name 지정되지 않은 경우 쿼리 최적화 프로그램은 테이블 또는 인덱싱된 뷰에 대한 모든 통계를 업데이트합니다. 여기에는 CREATE STATISTICS 문을 사용하여 생성된 통계, AUTO_CREATE_STATISTICS가 설정되어 생성된 단일 열 통계 및 인덱스에 대해 생성된 통계 등이 포함됩니다.
AUTO_CREATE_STATISTICS 대한 자세한 내용은 ALTER DATABASE SET 옵션을 참조 하세요. 테이블 또는 뷰에 대한 모든 인덱스를 보려면 sp_helpindex를 사용하면 됩니다.
FULLSCAN
테이블 또는 인덱싱된 뷰에 있는 모든 행을 검색하여 통계를 컴퓨팅합니다. FULLSCAN과 SAMPLE 100 PERCENT의 결과는 같습니다. FULLSCAN은 SAMPLE 옵션과 함께 사용할 수 없습니다.
SAMPLE number { PERCENT | ROWS }
쿼리 최적화 프로그램에서 통계를 업데이트할 때 사용할 테이블이나 인덱싱된 뷰에 있는 행의 비율이나 개수를 대략적으로 지정합니다. PERCENT의 경우 number가 0부터 100까지일 수 있고, ROWS의 경우 number가 0부터 총 행 수까지일 수 있습니다. 쿼리 최적화 프로그램에서 샘플링하는 실제 행의 비율이나 개수는 지정된 비율이나 개수와 일치하지 않을 수 있습니다. 예를 들어, 쿼리 최적화 프로그램에서는 데이터 페이지의 모든 행을 검색합니다.
SAMPLE은 기본 샘플링을 기반으로 하는 쿼리 계획이 만족스럽지 못한 특별한 경우에 유용합니다. 대부분의 경우에는 기본적으로 쿼리 최적화 프로그램에서 고품질의 쿼리 계획을 만들기 위해 필요에 따라 샘플링을 사용하고 통계적으로 중요한 샘플 크기를 결정하기 때문에 SAMPLE을 지정할 필요가 없습니다.
참고 항목
SQL Server 2016(13.x)에서 데이터베이스 호환성 수준 130을 사용하는 경우 통계 수집의 성능을 향상시키기 위해 데이터를 병렬로 샘플링하여 통계를 작성합니다. 쿼리 최적화 프로그램은 테이블 크기가 특정 임계값을 초과할 때마다 병렬 샘플 통계를 사용합니다. SQL Server 2017(14.x)부터 데이터베이스 호환성 수준에 관계없이 과도한 LATCH 대기 시 잠재적인 성능 문제를 방지하기 위해 동작이 직렬 검색을 사용하도록 다시 변경되었습니다. 통계를 업데이트하는 동안 나머지 쿼리 계획은 정규화된 경우 병렬 실행을 유지합니다.
SAMPLE은 FULLSCAN 옵션과 함께 사용할 수 없습니다. SAMPLE과 FULLSCAN을 둘 다 지정하지 않으면 기본적으로 쿼리 최적화 프로그램에서 샘플링된 데이터를 사용하고 샘플 크기를 계산합니다.
0 PERCENT 또는 0 ROWS로 지정하지 않는 것이 좋습니다. 0 PERCENT 또는 0 ROWS로 지정하면 통계 데이터가 포함되지 않은 빈 통계 개체가 업데이트됩니다.
대부분의 워크로드에서 전체 검사가 필요하지 않으며 기본 샘플링이 적당합니다. 그러나 매우 폭 넓은 데이터 배포에 민감한 특정 워크로드의 경우 샘플 크기를 증가시켜야 할 수 있으며 심지어 전체 검사가 필요할 수도 있습니다. 샘플링된 검사보다 전체 검사를 통해 예측값이 더 정확해질 수 있지만 복잡한 계획은 실질적으로 도움이 되지 않을 수 있습니다.
자세한 내용은 통계의 구성 요소 및 개념을 참조 하세요.
RESAMPLE
가장 최근의 샘플링 주기를 사용하여 각 통계를 업데이트합니다.
RESAMPLE을 사용하면 전체 테이블 검색이 수행될 수 있습니다. 예를 들어 인덱스에 대한 통계에서는 샘플링 주기에 전체 테이블 검색을 사용합니다. 샘플 옵션(SAMPLE, FULLSCAN, RESAMPLE)을 지정하지 않으면 기본적으로 쿼리 최적화 프로그램에서 데이터를 샘플링하여 샘플 크기를 계산합니다.
Microsoft Fabric의 Warehouse에서 RESAMPLE은 지원되지 않습니다.
PERSIST_SAMPLE_PERCENT = { ON | OFF }
적용 대상: SQL Server 2016(13.x) 서비스 팩 1 CU4, SQL Server 2017(14.x) 서비스 팩 1 또는 SQL Server 2019(15.x) 이상 버전, Azure SQL Database, Azure SQL Managed Instance
ON을 선택한 경우 통계는 샘플링 비율을 명시적으로 지정하지 않은 이후 업데이트에 대해 설정된 샘플링 비율을 유지합니다. OFF를 선택한 경우 샘플링 비율을 명시적으로 지정하지 않은 이후 업데이트의 통계 샘플링 비율은 기본 샘플링으로 재설정됩니다. 기본값은 OFF입니다.
DBCC SHOW_STATISTICS 및 sys.dm_db_stats_properties는 선택된 통계에 대해 유지되는 샘플 비율 값을 표시합니다.
AUTO_UPDATE_STATISTICS가 실행된 경우 유지된 샘플링 비율(사용 가능한 경우)을 사용하거나 사용 가능하지 않은 경우 기본 샘플링 비율을 사용합니다. RESAMPLE 동작은 이 옵션의 영향을 받지 않습니다.
테이블이 잘리면 잘린 힙 또는 B-트리(HoBT)에 빌드된 모든 통계가 기본 샘플링 비율을 사용하여 되돌아갑니다.
참고 항목
SQL Server에서 이전에 PERSIST_SAMPLE_PERCENT를 사용하여 통계를 업데이트한 인덱스를 다시 작성하는 경우 유지되는 샘플 비율이 다시 기본값으로 설정됩니다. SQL Server 2016(13.x) SP2 CU17, SQL Server 2017(14.x) CU26 및 SQL Server 2019 (15.x) CU10부터 인덱스를 다시 작성하는 경우에도 유지되는 샘플 비율이 유지됩니다.
ON PARTITIONS ( { <partition_number> | <range> } [, ...n] ) ]
적용 대상: SQL Server 2014(12.x) 이상
ON PARTITIONS 절에 지정된 파티션에 적용되는 리프 수준 통계를 강제로 다시 계산한 후 병합하여 전역 통계를 작성합니다. 서로 다른 샘플링 주기로 작성된 파티션 통계는 병합할 수 없으므로 WITH RESAMPLE이 필요합니다.
ALL | COLUMNS | INDEX
기존의 모든 통계, 하나 이상의 열에 대해 생성된 통계 또는 인덱스에 대해 생성된 통계를 업데이트합니다. 아무 옵션도 지정하지 않은 UPDATE STATISTICS 문은 테이블 또는 인덱싱된 뷰의 모든 통계를 업데이트합니다.
NORECOMPUTE
지정된 통계에 대해 자동 통계 업데이트 옵션인 AUTO_UPDATE_STATISTICS를 비활성화합니다. 이 옵션을 지정하지 않으면 쿼리 최적화 프로그램에서 이 통계 업데이트를 완료하고 이후 업데이트부터 비활성화합니다.
AUTO_UPDATE_STATISTICS 옵션 동작을 다시 사용하도록 설정하려면 NORECOMPUTE 옵션 없이 UPDATE STATISTICS를 다시 실행하거나 실행 sp_autostats
합니다.
Warning
이 옵션을 사용하면 최적이 아닌 쿼리 계획이 생성될 수 있습니다. 이 옵션은 자격 있는 시스템 관리자가 꼭 필요한 경우에만 사용하는 것이 좋습니다.
AUTO_STATISTICS_UPDATE 옵션에 대한 자세한 내용은 ALTER DATABASE SET 옵션을 참조 하세요.
INCREMENTAL = {ON | OFF}
적용 대상: SQL Server 2014(12.x) 이상
ON으로 설정된 경우 파티션 통계별로 통계가 다시 작성됩니다. OFF로 설정된 경우 통계 트리가 삭제되고 SQL Server에서 통계를 다시 계산합니다. 기본값은 OFF입니다.
파티션별 통계가 지원되지 않을 경우 오류가 생성됩니다. 다음 통계 유형에 대해서는 증분 통계가 지원되지 않습니다.
- 기본 테이블을 기준으로 파티션 정렬되지 않은 인덱스를 사용하여 작성된 통계
- Always On 읽기 가능한 보조 데이터베이스에 대해 작성된 통계입니다.
- 읽기 전용 데이터베이스에 대해 작성된 통계입니다.
- 필터링된 인덱스에 대해 작성된 통계입니다.
- 뷰에 대해 작성된 통계입니다.
- 내부 테이블에 대해 작성된 통계입니다.
- 공간 인덱스 또는 XML 인덱스를 사용하여 작성된 통계입니다.
MAXDOP = max_degree_of_parallelism
적용 대상: SQL Server (SQL Server 2016(13.x) SP2 및 SQL Server 2017(14.x) CU3부터 시작).
통계 작업 기간 동안 최대 병렬 처리 수준 구성 옵션을 재정의합니다. 자세한 내용은 max degree of parallelism 서버 구성 옵션 구성을 참조하세요. MAXDOP를 사용하여 병렬 계획 실행에 사용되는 프로세서 수를 제한할 수 있습니다. 최대값은 64개입니다.
max_degree_of_parallelism은 다음 중 하나일 수 있습니다.
1
병렬 계획이 생성되지 않습니다.
>1 병렬 통계 작업에 사용되는 최대 프로세서 수를 현재 시스템 워크로드에 따라 지정된 수 또는 더 적은 수로 제한합니다.
0
(기본값)
현재 시스템 작업에 따라 실제 프로세서 수 이하의 프로세서를 사용합니다.
update_stats_stream_option
정보를 제공하기 위해서만 확인됩니다. 지원 안 됨. 향후 호환성은 보장되지 않습니다.
AUTO_DROP = { ON | OFF }
적용 대상: SQL Server 2022(16.x) 이상
현재 고객 데이터베이스에서 타사 도구로 통계를 만드는 경우 이러한 통계 개체는 고객이 원하는 스키마 변경을 차단하거나 방해할 수 있습니다.
(SQL Server 2022(16.x)부터)| 이 기능을 사용하면 통계로 인해 스키마 변경이 차단되지 않고 대신 통계가 삭제되도록 통계 개체를 만들 수 있습니다. 이와 같이 자동 삭제 통계는 자동 생성 통계처럼 동작합니다.
참고
자동 생성된 통계에서 Auto_Drop 속성을 설정하거나 설정 해제하려고 하면 오류가 발생할 수 있습니다. 자동 생성 통계는 항상 자동 삭제를 사용합니다. 복원된 일부 백업은 다음에 통계 개체가 업데이트될 때까지(수동 또는 자동) 이 속성이 잘못 설정될 수 있습니다. 그러나 자동 생성 통계는 항상 자동 삭제 통계처럼 동작합니다.
설명
통계를 업데이트하는 경우
사용 UPDATE STATISTICS
시기에 대한 자세한 내용은 통계를 업데이트하는 시기를 참조 하세요.
제한 사항
- 외부 테이블에 대해서는 통계 업데이트가 지원되지 않습니다. 외부 테이블에 대한 통계를 업데이트하려면 통계를 삭제하고 다시 만듭니다.
MAXDOP
옵션은STATS_STREAM
,ROWCOUNT
및PAGECOUNT
옵션과 호환되지 않습니다.MAXDOP
옵션은 Resource Governor 워크로드 그룹MAX_DOP
설정으로 제한됩니다(사용된 경우).
sp_updatestats 사용하여 모든 통계 업데이트
데이터베이스의 모든 사용자 정의 및 내부 테이블에 대한 통계를 업데이트하는 방법에 대한 자세한 내용은 저장 프로시저 sp_updatestats 참조하세요. 예를 들어 다음 명령은 데이터베이스에 대한 모든 통계를 업데이트하기 위해 호출 sp_updatestats
합니다.
EXEC sp_updatestats;
자동 인덱스 및 통계 관리
Adaptive Index Defrag와 같은 솔루션을 사용하여 하나 이상의 데이터베이스에 대한 인덱스 조각 모음 및 통계 업데이트를 자동으로 관리합니다. 이 절차는 다른 매개 변수 사이에서 조각화 수준에 따라 인덱스를 다시 작성하거나 다시 구성할지 여부를 자동으로 선택하고 통계를 선형 임계값으로 업데이트합니다.
마지막 통계 업데이트 확인
통계가 마지막으로 업데이트된 시점을 확인하려면 STATS_DATE 함수를 사용합니다.
PDW/Azure Synapse Analytics
다음 구문은 PDW(Analytics Platform System) /Azure Synapse Analytics에서 지원되지 않습니다.
UPDATE STATISTICS t1 (a,b);
UPDATE STATISTICS t1 (a) WITH SAMPLE 10 ROWS;
UPDATE STATISTICS t1 (a) WITH NORECOMPUTE;
UPDATE STATISTICS t1 (a) WITH INCREMENTAL = ON;
UPDATE STATISTICS t1 (a) WITH stats_stream = 0x01;
사용 권한
테이블 또는 보기에 대한 ALTER
권한이 필요합니다.
예제
A. 테이블에 대한 모든 통계 업데이트
다음 예제에서는 SalesOrderDetail
테이블에서 모든 통계를 업데이트합니다.
USE AdventureWorks2022;
GO
UPDATE STATISTICS Sales.SalesOrderDetail;
GO
B. 인덱스에 대한 통계 업데이트
다음 예에서는 AK_SalesOrderDetail_rowguid
테이블의 SalesOrderDetail
인덱스에 대한 통계를 업데이트합니다.
USE AdventureWorks2022;
GO
UPDATE STATISTICS Sales.SalesOrderDetail AK_SalesOrderDetail_rowguid;
GO
C. 50퍼센트 샘플링을 사용하여 통계 업데이트
다음 예에서는 Name
테이블의 ProductNumber
및 Product
열에 대한 통계를 만든 후 업데이트합니다.
USE AdventureWorks2022;
GO
CREATE STATISTICS Products
ON Production.Product ([Name], ProductNumber)
WITH SAMPLE 50 PERCENT
-- Time passes. The UPDATE STATISTICS statement is then executed.
UPDATE STATISTICS Production.Product(Products)
WITH SAMPLE 50 PERCENT;
D. FULLSCAN 및 NORECOMPUTE를 사용하여 통계 업데이트
다음 예에서는 Products
테이블의 Product
통계를 업데이트하고 Product
테이블의 모든 행을 전체 검색하며 Products
통계에 대한 자동 통계를 비활성화합니다.
USE AdventureWorks2022;
GO
UPDATE STATISTICS Production.Product(Products)
WITH FULLSCAN, NORECOMPUTE;
GO
예: Azure Synapse Analytics 및 분석 플랫폼 시스템(PDW)
E. 테이블에 대한 모든 통계 업데이트
다음 예제에서는 Customer
테이블에서 CustomerStats1
통계를 업데이트합니다.
UPDATE STATISTICS Customer (CustomerStats1);
F. 전체 검사를 사용하여 통계 업데이트
다음 예제에서는 Customer
테이블의 모든 행 검사를 기반으로 CustomerStats1
통계를 업데이트합니다.
UPDATE STATISTICS Customer (CustomerStats1) WITH FULLSCAN;
G. 테이블에 대한 모든 통계 업데이트
다음 예제에서는 Customer
테이블에서 모든 통계를 업데이트합니다.
UPDATE STATISTICS Customer;
H. CREATE STATISTICS를 AUTO_DROP과 함께 사용
자동 삭제 통계를 사용하려면 통계 만들기 또는 업데이트의 “WITH” 절에 다음을 추가하기만 하면 됩니다.
UPDATE STATISTICS Customer (CustomerStats1) WITH AUTO_DROP = ON
관련 콘텐츠
- 통계
- Microsoft Fabric의 통계
- ALTER DATABASE(Transact-SQL)
- sys.dm_db_stats_properties(Transact-SQL)
- sys.dm_db_stats_histogram (Transact-SQL)
- CREATE STATISTICS(Transact-SQL)
- DBCC SHOW_STATISTICS(Transact-SQL)
- DROP STATISTICS(Transact-SQL)
- sp_autostats(Transact-SQL)
- sp_updatestats(Transact-SQL)
- STATS_DATE(Transact-SQL)