为 K-safety 安全设计分段投影
投影必须符合数据库 K-safety 要求。通常,您必须为每个分段投影创建伙伴实例投影,其中伙伴实例投影的数量为 K+1。因此,如果系统 K-safety 设置为 1,则必须通过一个伙伴实例复制每个投影分段;如果 K-safety 设置为 2,则必须通过两个伙伴实例复制每个分段。
自动创建伙伴实例投影
通过包括 SEGMENTED BY ... ALL NODES
,可以使用
CREATE PROJECTION
自动创建满足 K-safety 所需的伙伴实例投影数量。如果 CREATE PROJECTION
指定 K-safety (
KSAFE=n)
,Vertica 将使用该设置;如果语句省略 KSAFE
,Vertica 将使用系统 K-safety。
在以下示例中,CREATE PROJECTION
为表 ttt
创建分段投影 ttt_p1
。由于系统 K‑safety 设置为 1,因此 Vertica 需要每个分段投影拥有一个伙伴实例投影。由于“CREATE PROJECTION”语句省略“KSAFE”,因此 Vertica 使用系统 K‑safety 并创建两个伙伴实例投影:“ttt_p1_b0”和“ttt_p1_b1”:
=> SELECT mark_design_ksafe(1);
mark_design_ksafe
----------------------
Marked design 1-safe
(1 row)
=> CREATE TABLE ttt (a int, b int);
WARNING 6978: Table "ttt" will include privileges from schema "public"
CREATE TABLE
=> CREATE PROJECTION ttt_p1 as SELECT * FROM ttt SEGMENTED BY HASH(a) ALL NODES;
CREATE PROJECTION
=> SELECT projection_name from projections WHERE anchor_table_name='ttt';
projection_name
-----------------
ttt_p1_b0
ttt_p1_b1
(2 rows)
通过将后缀
_bn
附加到投影基本名(例如 ttt_p1_b0
),Vertica 自动为伙伴实例投影命名。
手动创建伙伴实例投影
如果在单个节点上创建投影并且系统 K-safety 大于 0,则必须手动创建 K-safety 所需的伙伴实例数量。例如,可以在单个节点上为表 xxx
创建投影 xxx_p1
,如下所示:
=> CREATE TABLE xxx (a int, b int);
WARNING 6978: Table "xxx" will include privileges from schema "public"
CREATE TABLE
=> CREATE PROJECTION xxx_p1 AS SELECT * FROM xxx SEGMENTED BY HASH(a) NODES v_vmart_node0001;
CREATE PROJECTION
由于 K-safety 设置为 1,此投影的单个实例不是 K-safe。若尝试将数据插入到它的锚表 xxx
,则会返回如下错误:
=> INSERT INTO xxx VALUES (1, 2);
ERROR 3586: Insufficient projections to answer query
DETAIL: No projections that satisfy K-safety found for table xxx
HINT: Define buddy projections for table xxx
为了符合 K-safety,您必须为投影 xxx_p1
创建一个伙伴实例投影。例如:
=> CREATE PROJECTION xxx_p1_buddy AS SELECT * FROM xxx SEGMENTED BY HASH(a) NODES v_vmart_node0002;
CREATE PROJECTION
表 xxx
现在符合 K-safety 并接受 DML 语句(例如 INSERT
):
VMart=> INSERT INTO xxx VALUES (1, 2);
OUTPUT
--------
1
(1 row)
另请参阅
有关分段投影和伙伴实例的一般信息,请参阅分段投影。有关 K-safety 设计的信息,请参阅K-safety 设计和分段设计。