将捆绑包元数据写入编录

Vertica 在内部将物理表数据与捆绑包内容的元数据一起存储在捆绑包中。查询优化器使用捆绑包元数据来查找和提取给定查询所需的数据。

Vertica 将捆绑包元数据存储在数据库编录中。这在 Eon 模式中特别有用:优化器可以在本地编录中找到此元数据,而不是从远程 (S3) 存储中提取它。这最大限度地减少了 S3 读取,并促进了更快的查询计划和整体执行。

Vertica 在以下两种情况下将捆绑包元数据写入编录:

  • 更改表内容的任何 DML 操作,例如 INSERTUPDATECOPY。Vertica 将捆绑包元数据写入新的或已更改的表数据的编录中。DML 操作对现有表数据的捆绑包元数据没有影响。

  • 对现有数据,作为 Vertica 元函数 DO_TM_TASK 的实参调用函数 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_b0inventory_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。您可以使用性能度量来估计更新其他文件需要多少时间。

  • 确定哪些表会受到频繁查询并相应地优先安排编录更新。