View a markdown version of this page

CREATE STATISTICS - Amazon Aurora DSQL

CREATE STATISTICS

支持的语法

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

说明

CREATE STATISTICS 将创建一个新的扩展统计对象来跟踪有关指定表的数据。此统计对象将在当前数据库中创建,并由发出该命令的用户拥有。

CREATE STATISTICS 命令有两种基本形式。第一种形式用于针对单个表达式收集单变量统计信息,其收益类似于表达式索引,但无需承担索引维护开销。此形式不可用于指定统计类型,因为多种统计类型仅适用于多变量统计。该命令的第二种形式可用于收集多列和/或表达式的多变量统计信息,并且可选择指定要包含的统计类型。此形式还可用于自动对列表中包含的所有表达式收集单变量统计信息。

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

参数

IF NOT EXISTS

如果同名的统计对象已存在,不引发错误。在这种情况下,将发出通知。请注意,此处仅考虑统计对象的名称,而不考虑其详细定义。在指定 IF NOT EXISTS 时,必须提供统计对象名称。

statistics_name

要创建的统计对象的名称(可选择使用架构限定名)。如果省略名称,Aurora DSQL 会根据父表的名称以及定义的列名称和/或表达式,选择合适的名称。

statistics_kind

要在此统计对象中计算的多变量统计类型。目前支持的类型为 ndistinct(启用 n-distinct 统计)、dependencies(启用函数依赖统计)和 mcv(启用最常见值列表统计)。如果省略此子句,则统计对象将包含所有受支持的统计类型。如果统计定义包含任何复杂表达式(而不仅仅是简单的列引用),则会自动构建单变量表达式统计。

column_name

要纳入计算统计的表列的名称。此参数只能在构建多变量统计时使用。必须至少指定两个列名或表达式,它们的顺序不重要。

expression

要纳入计算统计的表达式。可用于在单个表达式上构建单变量统计,也可作为多个列名和/或表达式列表的一部分来构建多变量统计。在后一种情况下,自动为列表中的每个表达式构建单独的单变量统计。

table_name

包含作为统计计算依据的列的表的名称(可选择使用架构限定名)。

备注

要创建读取某个表的统计对象,您必须是该表的所有者。不过,统计对象一经创建,其所有权便独立于底层表。

表达式统计是按表达式收集的,类似于在表达式上创建索引,只不过它无需承担索引维护开销。系统会自动为统计对象定义中的每个表达式生成表达式统计。

规划器目前不会将扩展统计对象用于表联接的选择性估算。

在 Aurora DSQL 中,您可在单个表上创建最多 5 个扩展统计对象。如果超过此限制,Aurora DSQL 将返回以下错误:more than 5 extended statistics per table are not allowed。有关更多信息,请参阅 Aurora DSQL 中的数据库限制。

示例

创建表 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 条件存在冗余,从而不会低估行数。

创建表 t2,其中包含两个完全相关的列(包含相同的数据),并基于这两个列创建一个 MCV 列表:

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 列表为规划器提供有关表中常见的特定值的更多详细信息,以及表中未出现的值组合选择性的上限,使得规划器能够在两种情况下生成更准确的估算值。