获取表统计信息的数据
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
返回此列的统计信息类型,如下所示:NONE
、ROWCOUNT
或FULL
。 -
STATISTICS_UPDATED_TIMESTAMP
将返回此列中最后一次收集统计信息的时间。
例如,以下示例架构定义了名为 trades 的表,该表将高度相关的列 bid
和 ask
分组在一起,并单独存储 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)
这一次,查询结果将出现几项变化: