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,启用函数依赖统计。如果省略此子句,统计对象将包含所有受支持的统计信息种类。更多信息请参见Section 14.2.2和Section 69.2。
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;
-- 匹配行的数量将被大大低估:
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 命令。