다음을 통해 공유


UPDATE STATISTICS(Transact-SQL)

적용 대상:Microsoft Fabric의 Microsoft Fabric SQL 데이터베이스에 있는 Microsoft Fabric Warehouse의 SQL Server Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System(PDW)SQL 분석 엔드포인트

테이블 또는 인덱싱된 뷰에서 쿼리 최적화 통계를 업데이트합니다 . 기본적으로 쿼리 최적화 프로그램은 이미 필요할 때 통계를 업데이트하여 쿼리 계획을 향상시킵니다. 하지만 경우에 따라 사용자가 UPDATE STATISTICS 또는 sp_updatestats 저장 프로시저를 사용하여 기본 업데이트 주기보다 더 자주 통계를 업데이트하여 쿼리 성능을 향상시킬 수 있습니다.

통계를 업데이트하면 쿼리가 최신 통계로 컴파일되지만 임의의 프로세스를 통해 통계를 업데이트하면 쿼리 계획이 자동으로 다시 컴파일될 수 있습니다. 쿼리 계획 향상과 쿼리 재컴파일 소요 시간 간의 성능 균형을 유지해야 하므로 통계를 너무 자주 업데이트하지 않는 것이 좋습니다. 구체적인 성능 균형 유지의 정도는 애플리케이션에 따라 달라집니다. UPDATE STATISTICS는 통계를 작성하기 위해 tempdb를 사용하여 행 샘플을 정렬할 수 있습니다.

참고 항목

Microsoft Fabric의 통계에 대한 자세한 내용은 패브릭 데이터 웨어하우징의 통계를 참조하세요.

Transact-SQL 구문 표기 규칙

Syntax

SQL Server 및 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_constant ]

Azure Synapse Analytics 및 병렬 데이터 웨어하우스에 대한 구문입니다.

UPDATE STATISTICS [ schema_name . ] table_name
    [ ( { statistics_name | index_name } ) ]
    [ WITH
       {
              FULLSCAN
            | SAMPLE number PERCENT
            | RESAMPLE
        }
    ]
[;]

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숫자는 0에서 100까지일 수 있으며, 숫자의 경우 ROWS0에서 총 행 수까지일 수 있습니다. 쿼리 최적화 프로그램에서 샘플링하는 실제 행의 비율이나 개수는 지정된 비율이나 개수와 일치하지 않을 수 있습니다. 예를 들어, 쿼리 최적화 프로그램에서는 데이터 페이지의 모든 행을 검색합니다.

SAMPLE 는 기본 샘플링에 따라 쿼리 계획이 최적이 아닌 특수한 경우에 유용합니다. 대부분의 경우 쿼리 최적화 프로그램이 샘플링을 사용하고 기본적으로 통계적으로 유의한 샘플 크기를 결정하기 때문에 고품질 쿼리 계획을 만드는 데 필요하므로 지정할 SAMPLE 필요가 없습니다.

참고 항목

SQL Server 2016(13.x)에서 데이터베이스 호환성 수준 130을 사용하는 경우 통계 수집의 성능을 향상시키기 위해 데이터를 병렬로 샘플링하여 통계를 작성합니다. 쿼리 최적화 프로그램은 테이블 크기가 특정 임계값을 초과할 때마다 병렬 샘플 통계를 사용합니다. SQL Server 2017(14.x)부터 데이터베이스 호환성 수준에 관계없이 과도한 LATCH 대기로 발생할 수 있는 성능 문제를 방지하기 위해 동작이 직렬 검색을 사용하도록 다시 변경되었습니다. 통계를 업데이트하는 동안 나머지 쿼리 계획은 정규화된 경우 병렬 실행을 유지합니다.

SAMPLE 옵션과 함께 FULLSCAN 사용할 수 없습니다. 둘 다 지정되지 SAMPLE 않은 FULLSCAN 경우 쿼리 최적화 프로그램은 샘플링된 데이터를 사용하고 기본적으로 샘플 크기를 계산합니다.

지정하거나 0 ROWS지정하지 않도록 하는 0 PERCENT 것이 좋습니다. 0 PERCENT 지정되거나 0 ROWS 지정되면 통계 개체가 업데이트되지만 통계 데이터가 포함되지 않습니다.

대부분의 워크로드에서 전체 검사가 필요하지 않으며 기본 샘플링이 적당합니다. 그러나 광범위한 데이터 배포에 민감한 특정 워크로드에는 샘플 크기가 증가하거나 전체 검사가 필요할 수 있습니다. 샘플링된 검사보다 전체 검사를 통해 예측값이 더 정확해질 수 있지만 복잡한 계획은 실질적으로 도움이 되지 않을 수 있습니다.

자세한 내용은 통계의 구성 요소 및 개념을 참조 하세요.

RESAMPLE

가장 최근의 샘플링 주기를 사용하여 각 통계를 업데이트합니다.

사용하면 RESAMPLE 전체 테이블 검색이 발생할 수 있습니다. 예를 들어 인덱스에 대한 통계에서는 샘플링 주기에 전체 테이블 검색을 사용합니다. 샘플 옵션(SAMPLE, FULLSCAN, RESAMPLE)이 지정되지 않은 경우 쿼리 최적화 프로그램은 데이터를 샘플링하고 기본적으로 샘플 크기를 계산합니다.

Microsoft Fabric RESAMPLE 의 Warehouse에서는 지원되지 않습니다.

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_STATISTICSsys.dm_db_stats_properties는 선택된 통계에 대해 유지되는 샘플 비율 값을 표시합니다.

실행되는 경우 사용 가능한 경우 AUTO_UPDATE_STATISTICS 지속형 샘플링 비율을 사용하거나, 그렇지 않은 경우 기본 샘플링 비율을 사용합니다. RESAMPLE 동작은 이 옵션의 영향을 받지 않습니다.

테이블이 잘리면 잘린 힙 또는 B-트리(HoBT)에 빌드된 모든 통계가 기본 샘플링 비율을 사용하여 되돌아갑니다. 마찬가지로, 행이 없는 개체에서 통계가 업데이트되는 경우 이전에 구성된 경우에도 PERSIST_SAMPLE_PERCENT 기본 샘플링 백분율을 사용하도록 되돌려집니다.

참고 항목

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 의합니다. 자세한 내용은 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시기에 대한 자세한 내용은 통계를 업데이트하는 시기를 참조 하세요.

제한 사항

  • 외부 테이블에 대해서는 통계 업데이트가 지원되지 않습니다. 외부 테이블에 대한 통계를 업데이트하려면 통계를 삭제하고 다시 만듭니다.
  • 각 columnstore 인덱스에 자동으로 생성된 통계 업데이트는 지원되지 않습니다. 이렇게 하면 오류 35337이 발생합니다. UPDATE STATISTICS failed because statistics cannot be updated on a columnstore index. UPDATE STATISTICS is valid only when used with the STATS_STREAM option.
  • MAXDOP 옵션은 STATS_STREAM, ROWCOUNTPAGECOUNT 옵션과 호환되지 않습니다.
  • MAXDOP 옵션은 Resource Governor 워크로드 그룹 MAX_DOP 설정으로 제한됩니다(사용된 경우).

sp_updatestats 사용하여 모든 통계 업데이트

데이터베이스의 모든 사용자 정의 및 내부 테이블에 대한 통계를 업데이트하는 방법에 대한 자세한 내용은 저장 프로시저 sp_updatestats 참조하세요. 예를 들어 다음 명령은 데이터베이스에 대한 모든 통계를 업데이트하기 위해 호출 sp_updatestats 합니다.

EXECUTE 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 테이블의 ProductNumberProduct 열에 대한 통계를 만든 후 업데이트합니다.

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. 테이블에 대한 모든 통계 업데이트

다음 예제에서는 CustomerStats1 테이블에서 Customer 통계를 업데이트합니다.

UPDATE STATISTICS Customer (CustomerStats1);

F. 전체 검사를 사용하여 통계 업데이트

다음 예제에서는 CustomerStats1 테이블의 모든 행 검사를 기반으로 Customer 통계를 업데이트합니다.

UPDATE STATISTICS Customer (CustomerStats1) WITH FULLSCAN;

G. 테이블에 대한 모든 통계 업데이트

다음 예제에서는 Customer 테이블에서 모든 통계를 업데이트합니다.

UPDATE STATISTICS Customer;

H. AUTO_DROP CREATE STATISTICS 사용

자동 삭제 통계를 사용하려면 통계 만들기 또는 업데이트의 “WITH” 절에 다음을 추가하기만 하면 됩니다.

UPDATE STATISTICS Customer (CustomerStats1) WITH AUTO_DROP = ON;