收集表统计信息

ANALYZE_STATISTICS 从存储目标表投影的所有节点中收集并聚合数据样本和存储信息。

您可以在多个级别中设置收集的范围:

ANALYZE_STATISTICS 还可以控制它收集的数据样本的大小。

分析所有数据库表

如果 ANALYZE_STATISTICS 未指定表,则它将收集所有数据库表及其投影的统计信息。例如:

=> SELECT ANALYZE_STATISTICS ('');
 ANALYZE_STATISTICS
--------------------
                  0
(1 row)

分析单个表

您可以按以下方式计算单个表的统计信息:

=> SELECT ANALYZE_STATISTICS ('public.store_orders_fact');
 ANALYZE_STATISTICS
--------------------
                  0
(1 row)

当您查询系统表 PROJECTION_COLUMNS 时,它将确认已在所有表列中收集 store_orders_fact 所有投影的统计信息:

=> SELECT projection_name, statistics_type, table_column_name,statistics_updated_timestamp
    FROM projection_columns WHERE projection_name ilike 'store_orders_fact%' AND table_schema='public';
   projection_name    | statistics_type | table_column_name | statistics_updated_timestamp
----------------------+-----------------+-------------------+-------------------------------
 store_orders_fact_b0 | FULL            | product_key       | 2019-04-04 18:06:55.747329-04
 store_orders_fact_b0 | FULL            | product_version   | 2019-04-04 18:06:55.747329-04
 store_orders_fact_b0 | FULL            | store_key         | 2019-04-04 18:06:55.747329-04
 store_orders_fact_b0 | FULL            | vendor_key        | 2019-04-04 18:06:55.747329-04
 store_orders_fact_b0 | FULL            | employee_key      | 2019-04-04 18:06:55.747329-04
 store_orders_fact_b0 | FULL            | order_number      | 2019-04-04 18:06:55.747329-04
 store_orders_fact_b0 | FULL            | date_ordered      | 2019-04-04 18:06:55.747329-04
 store_orders_fact_b0 | FULL            | date_shipped      | 2019-04-04 18:06:55.747329-04
 store_orders_fact_b0 | FULL            | quantity_ordered  | 2019-04-04 18:06:55.747329-04
 store_orders_fact_b0 | FULL            | shipper_name      | 2019-04-04 18:06:55.747329-04
 store_orders_fact_b1 | FULL            | product_key       | 2019-04-04 18:06:55.747329-04
 store_orders_fact_b1 | FULL            | product_version   | 2019-04-04 18:06:55.747329-04
...
(20 rows)

分析表列

在表中,您可以将分析范围缩小到其列的子集。通过这种方式,可以为包含许多列的大型表节省大量的处理开销。如果您经常查询这些表中的特定列,则此功能十分有用。

例如,您可以仅选择那些经常查询的列,而不是收集 store_orders_fact 中所有列的统计信息:product_keyproduct_versionorder_numberquantity_shipped

=> SELECT DROP_STATISTICS('public.store_orders_fact');
=> SELECT ANALYZE_STATISTICS ('public.store_orders_fact', 'product_key, product_version, order_number, quantity_ordered');
 ANALYZE_STATISTICS
--------------------
                  0
(1 row)

如果再次查询 PROJECTION_COLUMNS,它将返回以下结果:

=> SELECT projection_name, statistics_type, table_column_name,statistics_updated_timestamp
    FROM projection_columns WHERE projection_name ilike 'store_orders_fact%' AND table_schema='public';
   projection_name    | statistics_type | table_column_name | statistics_updated_timestamp
----------------------+-----------------+-------------------+------------------------------
 store_orders_fact_b0 | FULL            | product_key       | 2019-04-04 18:09:40.05452-04
 store_orders_fact_b0 | FULL            | product_version   | 2019-04-04 18:09:40.05452-04
 store_orders_fact_b0 | ROWCOUNT        | store_key         | 2019-04-04 18:09:40.05452-04
 store_orders_fact_b0 | ROWCOUNT        | vendor_key        | 2019-04-04 18:09:40.05452-04
 store_orders_fact_b0 | ROWCOUNT        | employee_key      | 2019-04-04 18:09:40.05452-04
 store_orders_fact_b0 | FULL            | order_number      | 2019-04-04 18:09:40.05452-04
 store_orders_fact_b0 | ROWCOUNT        | date_ordered      | 2019-04-04 18:09:40.05452-04
 store_orders_fact_b0 | ROWCOUNT        | date_shipped      | 2019-04-04 18:09:40.05452-04
 store_orders_fact_b0 | FULL            | quantity_ordered  | 2019-04-04 18:09:40.05452-04
 store_orders_fact_b0 | ROWCOUNT        | shipper_name      | 2019-04-04 18:09:40.05452-04
 store_orders_fact_b1 | FULL            | product_key       | 2019-04-04 18:09:40.05452-04
 store_orders_fact_b1 | FULL            | product_version   | 2019-04-04 18:09:40.05452-04
 store_orders_fact_b1 | ROWCOUNT        | store_key         | 2019-04-04 18:09:40.05452-04
 store_orders_fact_b1 | ROWCOUNT        | vendor_key        | 2019-04-04 18:09:40.05452-04
 store_orders_fact_b1 | ROWCOUNT        | employee_key      | 2019-04-04 18:09:40.05452-04
 store_orders_fact_b1 | FULL            | order_number      | 2019-04-04 18:09:40.05452-04
 store_orders_fact_b1 | ROWCOUNT        | date_ordered      | 2019-04-04 18:09:40.05452-04
 store_orders_fact_b1 | ROWCOUNT        | date_shipped      | 2019-04-04 18:09:40.05452-04
 store_orders_fact_b1 | FULL            | quantity_ordered  | 2019-04-04 18:09:40.05452-04
 store_orders_fact_b1 | ROWCOUNT        | shipper_name      | 2019-04-04 18:09:40.05452-04
(20 rows)

在这种情况下,只有对于那些已运行 ANALYZE_statistic,列 statistics_type 才会设置为 FULL。剩余的表列将设置为 ROWCOUNT,表示仅收集这些表列的行统计信息

数据收集百分比

默认情况下,Vertica 从磁盘中收集的样本固定为统计数据的 10%。指定从磁盘中读取的数据百分比,使您在决定样本准确性和速度方面具有更大的控制权。

所收集数据的百分比影响收集时间和准确性:

  • 百分比越小,速度越快,但返回的数据样本越小,这可能会影响直方图准确性。

  • 百分比越大,从磁盘读取的数据越多。数据收集变慢;但数据样本更大,因而直方图准确性更高。

例如:

从 20% 的磁盘中收集 shipping_dimension 的所有投影数据:

=> SELECT ANALYZE_STATISTICS ('shipping_dimension', 20);
 ANALYZE_STATISTICS
-------------------
                 0
(1 row)

通过将 percent 参数设置为 100,收集整个磁盘中的数据:

=> SELECT ANALYZE_STATISTICS ('shipping_dimension', 'shipping_key', 100);
 ANALYZE_STATISTICS
--------------------
                  0
(1 row)

采样大小

ANALYZE_STATISTICS 根据从所有收集的数据中随机选择的一组行来构建列直方图。无论百分比设置如何,该函数始终创建一个统计样本,其中最多包含下列两项中的较小者(近似值):

  • 217 (131,072) 行

  • 1 GB 内存所能容纳的行数

如果列所具有的行数少于最大样本大小,则 ANALYZE_STATISTICS 从磁盘中读取所有行并分析整个列。

下表显示设置为其他百分比的 ANALYZE_STATISTICS 如何从给定列获取统计样本: