CREATE STATISTICS — 拡張統計情報を定義する
CREATE STATISTICS [ IF NOT EXISTS ]statistics_name[ (statistics_kind[, ... ] ) ] ONcolumn_name,column_name[, ...] FROMtable_name
CREATE STATISTICSは指定したテーブル、外部テーブル、マテリアライズドビューのデータを追跡する新しい拡張統計オブジェクトを作成します。
統計オブジェクトは現在のデータベースに作成され、コマンドを実行したユーザに所有されます。
スキーマ名が指定された場合(例:CREATE STATISTICS myschema.mystat ...)、統計オブジェクトは指定したスキーマ内に作成されます。
スキーマ名を指定しなければ、現在のスキーマ内に作成されます。
統計オブジェクトの名前は、同じスキーマ内のどの統計オブジェクトとも異なるものでなければなりません。
IF NOT EXISTS同じ名前の統計オブジェクトが既に存在していてもエラーを発生させません。 この場合、注意メッセージが発行されます。 この場合、統計オブジェクトの名前だけが問題にされ、その定義の詳細は考慮されないことに注意してください。
statistics_name作成する統計オブジェクトの名前(オプションでスキーマ修飾可)です。
statistics_kind
この統計オブジェクト内で計算する統計の種別です。
現在サポートされる種別は、N個別値統計を有効にするndistinctと、関数的依存統計を有効にするdependenciesです。
この句を省略すると、統計オブジェクトのすべてのサポート対象の統計種別が含まれます。
より詳細な情報は14.2.2および70.2を参照してください。
column_name統計計算の対象となるテーブル列の名前です。 少なくとも2つの列名を指定しなければなりません。
table_name統計情報が計算される列があるテーブルの名前(オプションでスキーマ修飾可)です。
テーブルを読み取る統計オブジェクトを作るには、そのテーブルの所有者でなければなりません。 しかし、統計オブジェクトが作成された後は、その所有者と対象となるテーブルは無関係になります。
関数従属性のある2つの列を含むテーブルt1を作成します。
つまり、第1の列の値を知っていれば、それだけでもう一方の列の値がわかる、というものです。
その次に、これらの列の間に関数的依存統計を構築します。
CREATE TABLE t1 (
a int,
b int
);
INSERT INTO t1 SELECT i/100, i/500
FROM generate_series(1,1000000) s(i);
ANALYZE t1;
-- マッチする行の数は非常に低く見積もられる
EXPLAIN ANALYZE SELECT * FROM t1 WHERE (a = 1) AND (b = 0);
CREATE STATISTICS s1 (dependencies) ON a, b FROM t1;
ANALYZE t1;
-- 行数の見積もりがより正確になる
EXPLAIN ANALYZE SELECT * FROM t1 WHERE (a = 1) AND (b = 0);
関数的依存統計がなければ、プランナは2つのWHERE条件を独立なものとみなすため、それらの選択性を掛け算して、非常に小さな行数見積もりを導きます。
このような統計があれば、プランナはWHERE条件が冗長であることを認識し、行数を低く見積もりません。
標準SQLにCREATE STATISTICSコマンドはありません。