↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 13 / 12 / 11 / 10
历史版本。 PostgreSQL 11 已结束支持。 2023-11-09. 请参阅 当前版本手册.

CREATE STATISTICS

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,启用非重复值统计信息;以及 dependencies,启用函数依赖统计。如果省略此子句,统计对象将包含所有受支持的统计信息种类。更多信息请参见第 14.2.2 节和第 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 命令。

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.