CREATE STATISTICS
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要在此统计对象中计算的一种统计信息。目前支持的种类有:
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 命令。