================= CREATE STATISTICS ================= .. container:: refentry :name: SQL-CREATESTATISTICS .. container:: titlepage .. container:: refnamediv .. rubric:: CREATE STATISTICS :name: create-statistics CREATE STATISTICS — 定义扩展统计信息 .. container:: refsynopsisdiv .. rubric:: 大纲 :name: 大纲 .. code:: synopsis CREATE STATISTICS [ IF NOT EXISTS ] statistics_name [ ( statistics_kind [, ... ] ) ] ON column_name, column_name [, ...] FROM table_name .. container:: refsect1 :name: SQL-CREATESTATISTICS-DESCRIPTION .. rubric:: 描述 :name: 描述 ``CREATE STATISTICS``\ 将创建一个新的扩展统计对象, 追踪指定表、外部表或物化视图的数据。该统计对象将在当前数据库中创建, 被发出该命令的用户所有。 如果给定了模式名(比如,\ ``CREATE STATISTICS myschema.mystat ...``\ ), 那么在给定的模式中创建统计对象。否则在当前模式中创建。 统计对象的名称必须与相同模式中的任何其他统计对象不同。 .. container:: refsect1 :name: id-1.9.3.83.6 .. rubric:: 参数 :name: 参数 .. container:: variablelist ``IF NOT EXISTS`` 如果具有相同名称的统计对象已经存在,不会抛出一个错误,只会发出一个提示。 请注意,这里只考虑统计对象的名称,不考虑其定义细节。 ``statistics_name`` 要创建的统计对象的名称(可以有模式限定)。 ``statistics_kind`` 在此统计对象中计算的统计种类。目前支持的种类是启用n-distinct统计的 ``ndistinct``\ ,启用功能依赖性统计的\ ``dependencies``\ ,以及启用最常见的值列表的\ ``mcv``\ 。 如果省略该子句,则统计对象中将包含所有支持的统计类型。 ``column_name`` 被计算的统计信息包含的表格列的名称。至少必须给出两个列名,列名的顺序可以忽略。 ``table_name`` 包含计算统计信息的列的表的名称(可以是模式限定的)。 .. container:: refsect1 :name: id-1.9.3.83.7 .. rubric:: 注意 :name: 注意 你必须是表的所有者才能创建读取它的统计对象。不过,一旦创建, 统计对象的所有权与基础表无关。 .. container:: refsect1 :name: SQL-CREATESTATISTICS-EXAMPLES .. rubric:: 示例 :name: 示例 用两个功能相关的列创建表\ ``t1``\ , 即第一列中的值的信息足以确定另一列中的值。然后, 在这些列上构建函数依赖关系统计信息: .. code:: programlisting 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``\ 条件是多余的,并且不会低估行数。 创建表\ ``t2``\ 与两个完全相关的列(包含相同的数据),并且在这些列上创建一个MCV列表: .. code:: programlisting CREATE TABLE t2 ( a int, b int ); INSERT INTO t2 SELECT mod(i,100), mod(i,100) FROM generate_series(1,1000000) s(i); CREATE STATISTICS s2 (mcv) ON a, b FROM t2; ANALYZE t2; -- valid combination (found in MCV) EXPLAIN ANALYZE SELECT * FROM t2 WHERE (a = 1) AND (b = 1); -- invalid combination (not found in MCV) EXPLAIN ANALYZE SELECT * FROM t2 WHERE (a = 1) AND (b = 2); MCV列表为计划器提供了关于表中普遍出现的特定值的更详细的信息,以及表中未显示的值组合的选择性上限,允许它在这两种情况下产生更好的估计值。 .. container:: refsect1 :name: id-1.9.3.83.9 .. rubric:: 兼容性 :name: 兼容性 SQL标准中没有\ ``CREATE STATISTICS``\ 命令。 .. container:: refsect1 :name: id-1.9.3.83.10 .. rubric:: 又见 :name: 又见 `ALTER STATISTICS `__, `DROP STATISTICS `__