다음을 통해 공유


CREATE STATISTICS(Transact-SQL)

테이블 또는 인덱싱된 뷰의 하나 이상의 열에 대한 쿼리 최적화 통계(필터링된 통계 포함)를 만듭니다. 쿼리 최적화 프로그램은 대부분의 쿼리에 대해 고품질의 쿼리 계획에 필요한 통계를 기본적으로 생성합니다. 따라서 쿼리 성능을 향상시키기 위해 CREATE STATISTICS를 사용하여 추가 통계를 만들거나 쿼리 설계를 수정해야 하는 경우는 드뭅니다.

필터링된 통계는 잘 정의된 데이터의 하위 집합에서 선택하는 쿼리에 대한 쿼리 성능을 높일 수 있습니다. WHERE 절의 필터 조건자를 사용하여 통계에 포함되는 데이터의 하위 집합을 선택합니다.

CREATE STATISTICS를 사용하는 경우 등을 포함하여 쿼리에 대한 자세한 내용은 통계를 사용하여 쿼리 성능 향상을 참조하십시오.

항목 링크 아이콘Transact-SQL 구문 표기 규칙

구문

CREATE STATISTICS statistics_name 
ON { table_or_indexed_view_name } ( column [ ,...n ] ) 
    [ WHERE <filter_predicate> ]
    [ WITH 
        [ [ FULLSCAN 
          | SAMPLE number { PERCENT | ROWS } 
          | STATS_STREAM = stats_stream ] [ , ] ] 
        [ NORECOMPUTE ] 
    ] ;

<filter_predicate> ::= 
    <conjunct> [AND <conjunct>]

<conjunct> ::=
    <disjunct> | <comparison>

<disjunct> ::=
        column_name IN (constant ,…)

<comparison> ::=
        column_name <comparison_op> constant

<comparison_op> ::=
    IS | IS NOT | = | <> | != | > | >= | !> | < | <= | !<

인수

  • statistics_name
    만들 통계의 이름입니다.

  • table_or_indexed_view_name
    통계를 만들 대상이 되는 테이블 또는 인덱싱된 뷰의 이름입니다. 정규화된 테이블 이름을 지정하면 다른 데이터베이스에 있는 테이블 또는 인덱싱된 뷰에 대한 통계도 만들 수 있습니다.

  • column [ ,…n]
    통계를 만들 대상이 되는 키 열 또는 키 열 목록을 지정합니다. 다음 예외 사항을 제외하고 인덱스 키 열로 지정할 수 있는 모든 열을 지정할 수 있습니다.

    • Xml, 전체 텍스트 및 FILESTREAM 열은 지정할 수 없습니다.

    • ARITHABORT 및 QUOTED_IDENTIFIER 데이터베이스 설정이 ON으로 설정된 경우에만 계산 열을 지정할 수 있습니다.

    • CLR 사용자 정의 형식 열은 이진 순서 지정이 지원될 경우에만 지정할 수 있습니다. 사용자 정의 형식 열의 메서드 호출로 정의된 계산 열은 메서드가 결정적 메서드로 표시된 경우에 지정할 수 있습니다. CLR 사용자 정의 형식 열에 대한 자세한 내용은 CLR 사용자 정의 형식 작업를 참조하십시오.

    결합된 열 값의 최대 허용 크기는 900바이트입니다.

  • WHERE <filter_predicate>
    통계 개체를 만들 때 포함할 행 하위 집합을 선택하는 식을 지정합니다. 필터 조건자를 사용하여 만든 통계를 필터링된 통계라고 합니다. 필터 조건자는 간단한 비교 논리를 사용하며 계산 열, UDT 열, 공간 데이터 형식 열 또는 hierarchyID 데이터 형식 열을 참조할 수 없습니다. 비교 연산자에는 NULL 리터럴을 사용한 비교를 사용할 수 없습니다. 대신 IS NULL 및 IS NOT NULL 연산자를 사용합니다.

    다음은 Production.BillOfMaterials 테이블에 대한 필터 조건자의 예입니다.

    WHERE StartDate > '20000101' AND EndDate <= '20000630'

    WHERE ComponentID IN (533, 324, 753)

    WHERE StartDate IN ('20000404', '20000905') AND EndDate IS NOT NULL

    필터 조건자에 대한 자세한 내용은 필터링된 인덱스 디자인 지침을 참조하십시오.

  • FULLSCAN
    테이블 또는 인덱싱된 뷰에 있는 모든 행을 검색하여 통계를 계산합니다. FULLSCAN과 SAMPLE 100 PERCENT의 결과는 같습니다. FULLSCAN은 SAMPLE 옵션과 함께 사용할 수 없습니다.

  • SAMPLE number { PERCENT | ROWS }
    쿼리 최적화 프로그램에서 통계를 만들 때 사용할 테이블이나 인덱싱된 뷰에 있는 행의 비율이나 개수를 대략적으로 지정합니다. PERCENT의 경우 number가 0부터 100까지일 수 있고, ROWS의 경우 number가 0부터 총 행 수까지일 수 있습니다. 쿼리 최적화 프로그램에서 샘플링하는 실제 행의 비율이나 개수는 지정된 비율이나 개수와 일치하지 않을 수 있습니다. 예를 들어, 쿼리 최적화 프로그램에서는 데이터 페이지의 모든 행을 검색합니다.

    SAMPLE은 기본 샘플링을 기반으로 하는 쿼리 계획이 만족스럽지 못한 특별한 경우에 유용합니다. 대부분의 경우 쿼리 최적화 프로그램은 기본적으로 고품질의 쿼리 계획을 만들기 위해 필요에 따라 샘플링을 사용하고 통계적으로 중요한 샘플 크기를 결정하기 때문에 SAMPLE을 지정할 필요가 없습니다.

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

    0 PERCENT 또는 0 ROWS로 지정하지 않는 것이 좋습니다. 0 PERCENT 또는 0 ROWS로 지정하면 통계 데이터가 포함되지 않은 빈 통계 개체가 만들어집니다.

  • NORECOMPUTE
    statistics_name에 대해 자동 통계 업데이트 옵션인 AUTO_STATISTICS_UPDATE를 비활성화합니다 이 옵션을 지정하면 쿼리 최적화 프로그램에서 statistics_name에 대해 진행 중인 모든 통계 업데이트를 완료하고 이후의 업데이트를 비활성화합니다.

    통계 업데이트를 다시 활성화하려면 DROP STATISTICS를 사용하여 통계를 제거한 다음 NORECOMPUTE 옵션 없이 CREATE STATISTICS를 실행합니다.

    주의 사항주의

    이 옵션을 사용하면 최적이 아닌 쿼리 계획이 생성될 수 있습니다. 이 옵션은 자격 있는 시스템 관리자가 꼭 필요한 경우에만 사용하는 것이 좋습니다.

    AUTO_STATISTICS_UPDATE 옵션에 대한 자세한 내용은 ALTER DATABASE SET 옵션(Transact-SQL)을 참조하십시오 통계 업데이트를 비활성화하고 다시 활성화하는 방법은 통계를 사용하여 쿼리 성능 향상을 참조하십시오.

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

주의

다음 표에서는 통계와 관련된 최대 범주 수를 보여 줍니다.

통계 범주

Maximum

통계 개체당 열 수

32

인덱스에 대해 만든 통계 수

인덱스당 한 개, 테이블당 1,000개

열에 대해 만든 통계 수

테이블당 30,000개

CREATE STATISTICS를 사용하는 경우

CREATE STATISTICS를 사용하는 경우에 대한 자세한 내용은 통계를 사용하여 쿼리 성능 향상을 참조하십시오.

필터링된 통계의 종속성 참조

sys.sql_expression_dependencies 카탈로그 뷰에서는 필터링된 통계 조건자의 각 열을 종속성 참조로 추적합니다. 필터링된 통계 조건자에서 정의된 테이블 열은 삭제, 이름 바꾸기 또는 정의 변경을 수행할 수 없으므로 필터링된 통계를 만들기 전에 테이블 열에서 수행하는 작업을 고려하십시오.

사용 권한

통계를 만들려면 테이블 또는 인덱싱된 뷰의 소유자이거나 sysadmin 고정 서버 역할, db_owner 고정 데이터베이스 역할 또는 db_ddladmin 고정 데이터베이스 역할 중 하나의 멤버여야 합니다.

1. CREATE STATISTICS에 SAMPLE number PERCENT 사용

다음 예에서는 AdventureWorks 데이터베이스의 Contact 테이블에서 ContactID 및 EmailAddress 열에 대해 5% 무작위 샘플링을 사용하여 ContactMail1 통계를 만듭니다.

USE AdventureWorks;
GO
CREATE STATISTICS ContactMail1
    ON Person.Contact (ContactID, EmailAddress)
    WITH SAMPLE 5 PERCENT;

2. CREATE STATISTICS에 FULLSCAN 및 NORECOMPUTE 사용

다음 예에서는 Contact 테이블의 ContactID 및 EmailAddress 열에서 모든 행에 대한 ContactMail2 통계를 만듭니다. 통계의 자동 다시 계산 기능은 사용하지 않습니다.

CREATE STATISTICS NamePurchase
    ON AdventureWorks.Person.Contact (ContactID, EmailAddress)
    WITH FULLSCAN, NORECOMPUTE;

3. CREATE STATISTICS를 사용하여 필터링된 통계 만들기

다음 예에서는 필터링된 통계 ContactPromotion1을 만듭니다. 데이터베이스 엔진은 데이터의 50%를 샘플링한 다음 EmailPromotion이 2인 행을 선택합니다.

USE AdventureWorks;
GO
IF EXISTS (SELECT name FROM sys.stats
    WHERE name = N'ContactPromotion1'
    AND object_id = OBJECT_ID(N'Person.Contact'))
DROP STATISTICS Person.Contact.ContactPromotion1
GO
CREATE STATISTICS ContactPromotion1
    ON Person.Contact (ContactID, EmailAddress, EmailPromotion)
WHERE EmailPromotion = 2
WITH SAMPLE 50 PERCENT;
GO

변경 내역

업데이트된 내용

정확성을 향상시키기 위해 문서 전체를 수정했습니다.

통계를 사용하여 쿼리 성능 향상 항목의 새로운 통계 내용을 참조합니다.