CREATE STATISTICS (Transact-SQL)

テーブルまたはインデックス付きビューの 1 つまたは複数の列で、クエリの最適化に関する統計 (フィルター選択された統計情報を含む) を作成します。ほとんどのクエリでは、高品質のクエリ プランに必要な統計がクエリ オプティマイザーによって既に生成されていますが、クエリのパフォーマンスを向上させるために CREATE STATISTICS で追加の統計を作成したりクエリのデザインを変更したりする必要がある場合もあります。

適切に定義されたデータのサブセットから選択するクエリでは、フィルター選択された統計情報を使用するとクエリのパフォーマンスを向上させることができます。フィルター選択された統計情報では、統計情報に含まれるデータのサブセットを選択するために WHERE 句でフィルター述語を使用します。CREATE STATISTICS では、統計情報を構築する際、行のサンプルを並べ替える目的で tempdb が使用されます。

統計の詳細 (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 ユーザー定義型の使用」を参照してください。

  • WHERE <filter_predicate>
    統計オブジェクトを作成するときに含める行のサブセットを選択するための式を指定します。フィルター述語を使用して作成された統計は、フィルター選択された統計情報と呼ばれます。フィルター述語では単純な比較ロジックを使用するため、計算列、UDT 列、空間データ型列、または hierarchyID データ型列を参照することはできません。比較演算子では、NULL リテラルを使用する比較を実行できません。代わりに、IS NULL 演算子と IS NOT NULL 演算子を使用します。

    次に、Production.BillOfMaterials テーブルのフィルター述語の例をいくつか示します。

    WHERE StartDate > '20040101' AND EndDate <= '20040630'

    WHERE ComponentID IN (533, 324, 753)

    WHERE StartDate IN ('20040404', '20040905') 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
    単に情報を示すためだけに特定されます。サポートされていません。将来の互換性は保証されません。

説明

統計オブジェクトごとに最大 32 列を一覧表示できます。

CREATE STATISTICS を使用する場合

CREATE STATISTICS を使用する場合の詳細については、「クエリのパフォーマンスを向上させるための統計の使用」を参照してください。

フィルター選択された統計情報の参照による依存関係

sys.sql_expression_dependencies カタログ ビューでは、フィルター選択された統計情報の述語の各列を、参照による依存関係として追跡します。フィルター選択された統計情報の述語で定義されているテーブル列の定義を削除、名前変更、または変更することはできないので、フィルター選択された統計情報を作成する前に、テーブル列で実行する操作を検討してください。

権限

ALTER TABLE 権限を持っているか、テーブルまたはインデックス付きビューの所有者であるか、db_ddladmin 固定データベース ロールのメンバーである必要があります。

使用例

A. CREATE STATISTICS を SAMPLE number PERCENT と共に使用する

次の例では、AdventureWorks2008R2 データベースの Person テーブルにある BusinessEntityID 列と EmailAddress 列の 5% のランダムなサンプルを使用して、ContactMail1 統計情報を作成します。

USE AdventureWorks2008R2;
GO
CREATE STATISTICS ContactMail1
    ON Person.Person (BusinessEntityID, EmailPromotion)
    WITH SAMPLE 5 PERCENT;

B. CREATE STATISTICS を FULLSCAN および NORECOMPUTE と共に使用する

次の例では、Person テーブルの BusinessEntityID 列と EmailAddress 列のすべての行を対象に、ContactMail2 統計情報を作成し、統計の自動再計算を無効にします。

CREATE STATISTICS NamePurchase
    ON AdventureWorks2008R2.Person.Person (BusinessEntityID, EmailPromotion)
    WITH FULLSCAN, NORECOMPUTE;

C. CREATE STATISTICS を使用してフィルター選択された統計情報を作成する

次の例では、フィルター選択された統計情報 ContactPromotion1 を作成します。データベース エンジンによってデータの 50% がサンプリングされた後、EmailPromotion が 2 に等しい行が選択されます。

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