CREATE STATISTICS

定义扩展统计信息。

概要

CREATE STATISTICS [ IF NOT EXISTS ] <statistics_name>
    [ ( <statistics_kind> [, ... ] ) ]
    ON <column_name>, <column_name> [, ...]
    FROM <table_name>

描述

CREATE STATISTICS 创建一个新的扩展统计对象,用于跟踪指定表、外部表或物化视图的数据。该统计对象将在当前数据库中创建,并归属于执行该命令的用户。

如果指定了模式名称(例如 CREATE STATISTICS myschema.mystat ...),则统计对象将在指定模式中创建。否则,它将在当前模式中创建。统计对象的名称必须与同一模式中任何其他统计对象的名称不同。

参数

  • IF NOT EXISTS
    • 若已存在同名统计对象,则不应抛出错误。此时数据库将发出通知。请注意,此处仅考虑统计对象的名称,不涉及其定义的具体细节。
  • statistics_name
    • 要创建的统计对象的名称(可选带模式限定)。
  • statistics_kind
    • 本统计对象中需计算的统计类型。当前支持的类型包括:ndistinct(启用n个不同值统计)、dependencies(启用函数依赖统计)以及mcv(启用最常见值列表)。若省略此子句,则统计对象将包含所有支持的统计类型。
  • column_name
    • 要由计算统计信息覆盖的表列名称。必须至少指定两个列名;列名的顺序无关紧要。
  • table_name
    • 包含统计信息计算所依据列的表名(可选带模式限定);有关继承和分区处理的说明,请参阅 ANALYZE

注意

您必须是表的所有者才能创建读取该表的统计对象。但一旦创建,统计对象的所有权就与底层表无关。

示例

创建表 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);

若缺少函数依赖统计信息,规划器会假设两个WHERE条件相互独立,并将它们的选择性相乘,从而得出过低的行数估计值。而拥有此类统计信息时,规划器能识别WHERE条件存在冗余,从而避免低估行数。

Create table t2 with two perfectly correlated columns (containing identical data), and a MCV list on those columns:

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列表为规划者提供了更详细的信息,包括表格中常见值的具体数值,以及表格中未出现值组合的选择性上限,从而使其能够在两种情况下都生成更精确的估计值。

兼容性

SQL标准中不存在CREATE STATISTICS语句。

另见

ALTER STATISTICS, DROP STATISTICS