获取表统计信息的数据

Vertica 通过两种方式提供给定表及其列和分区的统计信息:

  • 查询优化器将通知您统计信息的可用性,以处理给定的查询。

  • 系统表 PROJECTION_COLUMNS 将显示表列可用的统计信息类型以及上次更新的时间。

查询评估

在谓词选择性估算期间,查询优化器可以确定直方图何时不可用或过期。如果谓词中的值超出了直方图的最大范围,则统计信息已过时。如果没有直方图可用,则没有统计信息可用于计划。

当优化器检测到过时统计信息或没有统计信息时(例如遇到没有相应直方图的列谓词时),优化器会执行以下操作:

  • 显示并记录一条您应运行 ANALYZE_STATISTICS 的消息。

  • 使用一个统计信息条目对 EXPLAIN 生成的查询计划进行注释。

  • 在生成查询计划时忽略过时的统计信息。优化器会根据其他注意事项(例如 FK-PK 约束)来创建查询计划。

例如,以下查询计划片段显示没有统计信息(直方图不可用):

| | +-- Outer -> STORAGE ACCESS for fact [Cost: 604, Rows: 10K (NO STATISTICS)]

以下查询计划片段显示谓词超出了直方图的范围:

| | +-- Outer -> STORAGE ACCESS for fact [Cost: 35, Rows: 1 (PREDICATE VALUE OUT-OF-RANGE)]

PROJECTION_COLUMNS 中的统计数据

系统表 PROJECTION_COLUMNS 中的两列将显示每个表列的统计状态,如下所示:

  • STATISTICS_TYPE 返回此列的统计信息类型,如下所示:NONEROWCOUNTFULL

  • STATISTICS_UPDATED_TIMESTAMP 将返回此列中最后一次收集统计信息的时间。

例如,以下示例架构定义了名为 trades 的表,该表将高度相关的列 bidask 分组在一起,并单独存储 stock 列:

=> CREATE TABLE trades (stock CHAR(5), bid INT, ask INT);
=> CREATE PROJECTION trades_p (
     stock ENCODING RLE, GROUPED(bid ENCODING DELTAVAL, ask))
     AS (SELECT * FROM trades) ORDER BY stock, bid;
=> INSERT INTO trades VALUES('acme', 10, 20);
=> COMMIT;

PROJECTION_COLUMNS 表中查询 trades 表:

=> SELECT table_name AS table, projection_name AS projection, table_column_name AS column, statistics_type, statistics_updated_timestamp AS last_updated
     FROM projection_columns WHERE table_name = 'trades';
 table  | projection  | column | statistics_type | last_updated
--------+-------------+--------+-----------------+--------------
 trades | trades_p_b0 | stock  | NONE            |
 trades | trades_p_b0 | bid    | NONE            |
 trades | trades_p_b0 | ask    | NONE            |
 trades | trades_p_b1 | stock  | NONE            |
 trades | trades_p_b1 | bid    | NONE            |
 trades | trades_p_b1 | ask    | NONE            |
(6 rows)

statistics_type 列将为 trades 表中的所有列返回 NONE,而 statistics_updated_timestamp 则为空,因为尚未收集此表中的统计信息。

现在,请对 stock 列运行 ANALYZE_STATISTICS

=> SELECT ANALYZE_STATISTICS ('public.trades', 'stock');
 ANALYZE_STATISTICS
--------------------
                  0
(1 row)

现在,当您查询 PROJECTION_COLUMNS 时,它将返回以下结果:

=> SELECT table_name AS table, projection_name AS projection, table_column_name AS column, statistics_type, statistics_updated_timestamp AS last_updated
     FROM projection_columns WHERE table_name = 'trades';
 table  | projection  | column | statistics_type |         last_updated
--------+-------------+--------+-----------------+-------------------------------
 trades | trades_p_b0 | stock  | FULL            | 2019-04-03 12:00:12.231564-04
 trades | trades_p_b0 | bid    | ROWCOUNT        | 2019-04-03 12:00:12.231564-04
 trades | trades_p_b0 | ask    | ROWCOUNT        | 2019-04-03 12:00:12.231564-04
 trades | trades_p_b1 | stock  | FULL            | 2019-04-03 12:00:12.231564-04
 trades | trades_p_b1 | bid    | ROWCOUNT        | 2019-04-03 12:00:12.231564-04
 trades | trades_p_b1 | ask    | ROWCOUNT        | 2019-04-03 12:00:12.231564-04
(6 rows)

这一次,查询结果将出现几项变化: