CREATE STATISTICS — define extended 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 70.2。
column_name被计算出的统计信息覆盖的表列的名称。至少必须给出两个列名。
table_name包含在其上计算统计信息的列的表名(可以是被方案限定的)。
要为一个表创建一个读取它的统计信息对象,你必须是该表的拥有者。不过,一旦被创建,统计信息对象的拥有关系就不依赖底层的表了。
创建有两个函数依赖列的表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命令。