将捆绑包元数据写入编录
Vertica 在内部将物理表数据与捆绑包内容的元数据一起存储在捆绑包中。查询优化器使用捆绑包元数据来查找和提取给定查询所需的数据。
Vertica 将捆绑包元数据存储在数据库编录中。这在 Eon 模式中特别有用:优化器可以在本地编录中找到此元数据,而不是从远程 (S3) 存储中提取它。这最大限度地减少了 S3 读取,并促进了更快的查询计划和整体执行。
Vertica 在以下两种情况下将捆绑包元数据写入编录:
-
更改表内容的任何 DML 操作,例如
INSERT
、UPDATE
或COPY
。Vertica 将捆绑包元数据写入新的或已更改的表数据的编录中。DML 操作对现有表数据的捆绑包元数据没有影响。 -
对现有数据,作为 Vertica 元函数
DO_TM_TASK
的实参调用函数UPDATE_STORAGE_CATALOG
。您可以将编录更新操作的范围缩小到特定的投影或表。如果未指定范围,则该操作将应用于整个数据库。重要
在升级到 Vertica 9.2.1 及任何更高版本后,您只需对现有数据调用一次UPDATE_STORAGE_CATALOG
。所有新数据或更新数据的捆绑包元数据始终自动写入编录。
例如,以下 DO_TM_TASK
调用将捆绑包元数据写入表 store.store_sales_fact
中的所有投影上:
=> SELECT DO_TM_TASK ('update_storage_catalog', 'store.store_sales_fact');
do_tm_task
-------------------------------------------------------------------------------
Task: update_storage_catalog
(Table: store.store_sales_fact) (Projection: store.store_sales_fact_b0)
(Table: store.store_sales_fact) (Projection: store.store_sales_fact_b1)
(1 row)
验证捆绑包元数据
您可以查询系统表
STORAGE_BUNDLE_INFO_STATISTICS
以确定哪些投影在数据库编录中具有无效捆绑包元数据。例如,以下查询的结果显示,数据库编录中的投影 inventory_fact_b0
和 inventory_fact_b1
元数据无效:
=> SELECT node_name, projection_name, total_ros_count, ros_without_bundle_info_count
FROM v_monitor.storage_bundle_info_statistics where ros_without_bundle_info_count > 0
ORDER BY projection_name, node_name;
node_name | projection_name | total_ros_count | ros_without_bundle_info_count
------------------+-------------------+-----------------+-------------------------------
v_vmart_node0001 | inventory_fact_b0 | 1 | 1
v_vmart_node0002 | inventory_fact_b0 | 1 | 1
v_vmart_node0003 | inventory_fact_b0 | 1 | 1
v_vmart_node0001 | inventory_fact_b1 | 1 | 1
v_vmart_node0002 | inventory_fact_b1 | 1 | 1
v_vmart_node0003 | inventory_fact_b1 | 1 | 1
(6 rows)
最佳实践
仅建议 Eon 用户使用 UPDATE_STORAGE_CATALOG
更新数据库编录。企业用户不太可能从该更新中看到明显的性能改进。
调用 UPDATE_STORAGE_CATALOG
可能会产生相当大的开销,因为更新过程通常需要大量代价高昂的 S3 读取。Vertica 建议不要对整个数据库运行此操作,而是考虑采用增量方法:
-
对单个大型事实表调用
UPDATE_STORAGE_CATALOG
。您可以使用性能度量来估计更新其他文件需要多少时间。 -
确定哪些表会受到频繁查询并相应地优先安排编录更新。