收集表统计信息
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_key
、product_version
、order_number
和 quantity_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
,表示仅收集这些表列的行统计信息。
注意
ANALYZE_STATISTICS 始终在所有表列中调用 ANALYZE_ROW_COUNT,即使 ANALYZE_STATISTICS 已指定这些列的子集同样如此。数据收集百分比
默认情况下,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 如何从给定列获取统计样本: