选择 打开 改范围 完整检索页
受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10
当前 PostgreSQL 版本不在支持生命周期内。
您可以参阅当前版本的对应页面,或其他在上面列出的活跃大版本。

CREATE STATISTICS

CREATE STATISTICS — 定义扩展统计信息

Synopsis

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,启用不同值数量统计;以及dependencies,启用函数依赖统计。如果省略此子句,统计对象将包含所有受支持的统计信息种类。更多信息请参见Section 14.2.2Section 71.2

column_name

所计算统计信息要涵盖的表列名称。必须至少给出两个列名。

table_name

包含用于计算统计信息的列的表名称(可选模式限定); 关于继承和分区的处理方式,参见 ANALYZE

注解

必须是表的所有者,才能创建读取该表数据的统计对象。不过,一旦创建, 统计对象的所有权就独立于底层表。

扩展统计信息目前尚未被规划器用于表连接的选择率估计。这个限制很可能会在未来版本的 PostgreSQL 中被移除。

示例

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

-- 匹配行的数量将被大大低估:
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);

没有函数依赖统计时,规划器会假定这两个WHERE条件彼此独立,并将它们的选择率相乘,从而得到一个过低的行数估计。有了这种统计信息,规划器就能识别出WHERE条件是冗余的,因此不会低估行数。

兼容性

SQL 标准中没有 CREATE STATISTICS 命令。