CREATE STATISTICS (Transact-SQL)

テーブルまたはインデックス付きビューの 1 つまたは複数の列で、クエリの最適化に関する統計 (フィルタ選択された統計情報を含む) を作成します。ほとんどのクエリでは、高品質のクエリ プランに必要な統計がクエリ オプティマイザによって既に生成されていますが、クエリのパフォーマンスを向上させるために 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
    単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。

説明

次の表に、統計に関連するカテゴリの最大数を示します。

統計のカテゴリ

最大数

統計オブジェクトあたりの列数

32

インデックスに対して作成される統計数

インデックスごとに 1 つ、またはテーブルごとに 1000

列に対して作成される統計数

テーブルごとに 30,000

CREATE STATISTICS を使用する場合

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

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

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

権限

統計を作成するには、ユーザーはテーブルまたはインデックス付きビューの所有者であるか、sysadmin 固定サーバー ロール、db_owner 固定データベース ロール、または db_ddladmin 固定データベース ロールのメンバである必要があります。

A. 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;

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

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

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

C. 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

変更履歴

変更内容

より正確な内容にするためにドキュメント全体を修正しました。

クエリのパフォーマンスを向上させるための統計の使用」の統計に関する新しい記述を参照しています。