CREATE STATISTICS

创建统计信息-定义扩展统计信息

Synopsis

CREATE STATISTICS [ IF NOT EXISTS ] statistics_name
    [ ( statistics_kind [, ... ] ) ]
    ON column_name, column_name [, ...]
    FROM table_name

Description

CREATE STATISTICS将创建一个新的扩展统计对象,用于跟踪有关指定表,外部表或实例化视图的数据。统计信息对象将在当前数据库中创建,并由发出命令的用户拥有。

如果指定了架构名称(例如CREATE STATISTICS myschema.mystat ...),那么将在指定的架构中创建统计信息对象。否则,它将在当前架构中创建。统计对象的名称必须与同一架构中任何其他统计对象的名称不同。

Parameters

  • IF NOT EXISTS

    • 如果已经存在具有相同名称的统计对象,则不要引发错误。在这种情况下发出通知。请注意,此处仅考虑统计对象的名称,而不考虑其定义的详细信息。
  • statistics_name

    • 要创建的统计对象的名称(可选的模式限定)。
  • statistics_kind

    • 要在此统计信息对象中计算的统计信息种类。当前支持的种类是ndistinctdependenciesndistinct启用 n-distinct 统计信息,dependencies启用功能依赖性统计信息。如果省略此子句,则统计对象中将包括所有受支持的统计种类。有关更多信息,请参见Section 14.2.2Section 70.2
  • column_name

    • 计算的统计信息涵盖的表列的名称。至少必须提供两个列名。
  • table_name

    • 包含要计算统计信息的列的表的名称(可选,由模式限定)。

Notes

您必须是表的所有者才能创建读取该表的统计信息对象。但是,一旦创建,统计对象的所有权就独立于基础表。

Examples

创建具有两个功能相关列的表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;

-- the number of matching rows will be drastically underestimated:
EXPLAIN ANALYZE SELECT * FROM t1 WHERE (a = 1) AND (b = 0);

CREATE STATISTICS s1 (dependencies) ON a, b FROM t1;

ANALYZE t1;

-- now the row count estimate is more accurate:
EXPLAIN ANALYZE SELECT * FROM t1 WHERE (a = 1) AND (b = 0);

如果没有功能相关性统计信息,则计划者将假定两个WHERE条件是独立的,并将它们的选择性相乘在一起,得出的行数估计值太小。有了这样的统计信息,计划者就会意识到WHERE条件是多余的,并且不会低估行数。

Compatibility

SQL 标准中没有CREATE STATISTICS命令。

See Also

ALTER STATISTICS, DROP STATISTICS