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
在此统计对象中计算的统计种类。目前支持的种类是启用n-distinct统计的 ndistinct,以及启用功能依赖性统计的dependencies。 如果省略该子句,则统计对象中将包含所有支持的统计类型。 有关更多信息,请参阅第 14.2.2 节和 第 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 条件是多余的,并且不会低估行数。