

# `CREATE STATISTICS`
<a name="create-statistics-syntax-support"></a>

## サポートされている構文
<a name="create-statistics-supported-syntax"></a>

```
CREATE STATISTICS [ [ IF NOT EXISTS ] statistics_name ]
    ON ( expression )
    FROM table_name

CREATE STATISTICS [ [ IF NOT EXISTS ] statistics_name ]
    [ ( statistics_kind [, ... ] ) ]
    ON { column_name | ( expression ) }, { column_name | ( expression ) } [, ...]
    FROM table_name
```

## 説明
<a name="create-statistics-description"></a>

`CREATE STATISTICS` は、指定したテーブルに関するデータを追跡する新しい拡張統計オブジェクトを作成します。統計オブジェクトは、現在のデータベースに作成され、コマンドを発行したユーザーが所有します。

`CREATE STATISTICS` コマンドには 2 つの基本的な形式があります。最初の形式では、単一の式の単変量統計を収集できるため、インデックスのメンテナンスというオーバーヘッドなしに、式インデックスと同様の利点が得られます。この形式では統計の種類を指定できません。さまざまな統計の種類は多変量統計のみを参照するためです。コマンドの 2 番目の形式では、複数の列や式に対する多変量統計を収集でき、含める統計の種類を任意で指定できます。この形式では、リストに含まれる任意の式に対して単変量統計も自動的に収集されます。

スキーマ名 (例: `CREATE STATISTICS myschema.mystat ...`) を指定すると、統計オブジェクトは指定したスキーマ内に作成されます。指定しない場合、現在のスキーマに作成されます。指定する場合、統計オブジェクトの名前は、同じスキーマ内の他の統計オブジェクトの名前と重複しないようにする必要があります。

## パラメータ
<a name="create-statistics-parameters"></a>

**`IF NOT EXISTS`**  
同じ名前の統計オブジェクトが既に存在しても、エラーはスローされません。この場合、通知が発行されます。ここでは、統計オブジェクトの名前のみが考慮され、定義の詳細は考慮されないことに注意してください。`IF NOT EXISTS` を指定する場合は、統計名が必須です。

**{{statistics\_name}}**  
作成する統計オブジェクトの名前 (スキーマ修飾名も可)。名前を省略すると、Aurora DSQL は、親テーブルの名前および定義された列名および/または式に基づいて適切な名前を選択します。

**{{statistics\_kind}}**  
この統計オブジェクトで計算される多変量統計の種類。現在サポートされている種類は `ndistinct` (n 個の異なる統計を有効にする)、`dependencies` (関数従属性統計を有効にする)、および `mcv` (最頻値リストを有効にする) です。この句を省略すると、サポートされているすべての統計の種類が統計オブジェクトに含まれます。統計定義に単純な列参照だけでなく複雑な式が含まれている場合、単変量式の統計は自動的に構築されます。

**{{column\_name}}**  
統計計算の対象となるテーブル列の名前。これは、多変量統計を構築する場合にのみ許可されます。少なくとも 2 つの列名または式を指定する必要があり、その順序は重要ではありません。

**{{式}}**  
統計計算の対象となる式。これは、単一の式で単変量統計を構築する場合に使用できます。または多変量統計を構築する場合に複数の列名や式のリストの一部として使用できます。後者の場合、リスト内の式ごとに個別の単変量統計が自動的に構築されます。

**{{table\_name}}**  
統計を計算する列を含むテーブルの名前 (スキーマ修飾名も可)。

## 注意事項
<a name="create-statistics-notes"></a>

テーブルを読み取る統計オブジェクトを作成するには、テーブルの所有者である必要があります。ただし、作成後の統計オブジェクトの所有権は、基となるテーブルから独立します。

式統計は式ごとに作成します。式にインデックスを作成する場合と似ていますが、インデックスのメンテナンスに伴うオーバーヘッドを回避できるという点が異なります。式統計は、統計オブジェクト定義内の各式に対して自動的に構築されます。

現在、プランナーはテーブル結合に対する選択度推定に拡張統計を使用していません。

Aurora DSQL では、1 つのテーブルに対して最大 5 つの拡張統計オブジェクトを作成できます。この制限を超えると、Aurora DSQL はエラー `more than 5 extended statistics per table are not allowed` を返します。詳細については、「[Aurora DSQL のデータベース制限](CHAP_quotas.md#SECTION_database-limits)」を参照してください。

## 例
<a name="create-statistics-examples"></a>

2 つの関数従属列を含むテーブル `t1` を作成します。つまり、最初の列の値がわかれば、他方の列の値を十分に特定できます。次に、これらの列に基づいて関数従属統計を構築します。

```
CREATE TABLE t1 (
    a   int,
    b   int
);

INSERT INTO t1 SELECT i/100, i/500
                 FROM generate_series(1,1000000) s(i);

ANALYZE t1;

-- the number of matching rows will be drastically underestimated:
EXPLAIN ANALYZE SELECT * FROM t1 WHERE (a = 1) AND (b = 0);

CREATE STATISTICS s1 (dependencies) ON a, b FROM t1;

ANALYZE t1;

-- now the row count estimate is more accurate:
EXPLAIN ANALYZE SELECT * FROM t1 WHERE (a = 1) AND (b = 0);
```

関数従属統計がない場合、プランナーは 2 つの `WHERE` 条件が独立していると仮定し、それぞれの選択度を乗算することで、実際よりも行数を過小評価してしまいます。このような統計があると、プランナーは `WHERE` 条件が冗長であることを認識し、行数を過小評価することはありません。

完全に相関する 2 つの列 (同一のデータを含む) と、それらの列に関する MCV リストを含むテーブル `t2` を作成します。

```
CREATE TABLE t2 (
    a   int,
    b   int
);

INSERT INTO t2 SELECT mod(i,100), mod(i,100)
                 FROM generate_series(1,1000000) s(i);

CREATE STATISTICS s2 (mcv) ON a, b FROM t2;

ANALYZE t2;

-- valid combination (found in MCV)
EXPLAIN ANALYZE SELECT * FROM t2 WHERE (a = 1) AND (b = 1);

-- invalid combination (not found in MCV)
EXPLAIN ANALYZE SELECT * FROM t2 WHERE (a = 1) AND (b = 2);
```

MCV リストは、テーブルによく出現する特定の値に関する、より詳細な情報をプランナーに提供します。また、テーブルに出現しない値の組み合わせに対して選択度の上限も提供するため、どちらの場合でも、プランナーはより精度の高い推定値を生成できます。