K-safe 数据库投影

对于分段投影和未分段投影,K-safety 的实施方式有所不同,如下所述。示例假定在 3 节点数据库中将数据库 K-safety 设置为 1,并对两个表使用投影:

  • store.store_orders_fact 是一个大型事实表。此表的投影应为分段投影。Vertica 会在群集中均匀地分布投影段。

  • store.store_dimension 是一个较小的维度表。此表的投影应为未分段投影。Vertica 会在每个群集节点上复制此投影的完整实例。

分段投影

在 K-safe 数据库中,数据库需要每个投影段的 K+1 个实例或伙伴实例。例如,如果数据库 K-safety 设置为 1,则数据库要求每个投影段有两个实例或伙伴实例。

可以通过 CREATE PROJECTION 选项 KSAFE 设置各个分段投影的 K-safety。投影 K-safety 必须大于等于数据库 K-safety。如果省略设置 KSAFE,投影将从数据库获取 K-safety。

以下 CREATE PROJECTION 为事实表 store.store_orders_fact 定义分段投影:

=> CREATE PROJECTION store.store_orders_fact
          (prodkey, ordernum, storekey, total)
          AS SELECT product_key, order_number, store_key, quantity_ordered*unit_price
          FROM store.store_orders_fact
          SEGMENTED BY HASH(product_key, order_number) ALL NODES KSAFE 1;
CREATE PROJECTION

CREATE PROJECTION 语句中的以下关键字与设置投影 K-safety 相关:

未分段投影

在 K-safe 数据库中,必须在所有节点上复制未分段投影。因此,未分段投影的 CREATE PROJECTION 语句必须包括分段子句 UNSEGMENTED ALL NODES。这指示 Vertica 在所有群集节点上创建投影的相同实例(伙伴实例)。如果在单个节点上创建未分段投影,则 Vertica 会认为它不安全,并且不会使用它。

以下示例展示了如何为表 store.store_dimension 创建未分段投影:


=> CREATE PROJECTION store.store_dimension_proj (storekey, name, city, state)
             AS SELECT store_key, store_name, store_city, store_state
             FROM store.store_dimension
             UNSEGMENTED ALL NODES;
CREATE PROJECTION

Vertica 使用相同的名称来标识未分段投影的所有实例 — 在此示例中为 store.store_dimension_proj。关键字 ALL NODES 指定在所有节点上复制投影:


=> \dj store.store_dimension_proj
                         List of projections
 Schema |         Name         |  Owner  |       Node       | Comment
--------+----------------------+---------+------------------+---------
 store  | store_dimension_proj | dbadmin | v_vmart_node0001 |
 store  | store_dimension_proj | dbadmin | v_vmart_node0002 |
 store  | store_dimension_proj | dbadmin | v_vmart_node0003 |
(3 rows)

有关投影名称约定的详细信息,请参阅投影命名