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)
有关投影名称约定的详细信息,请参阅投影命名。