这是本节的多页打印视图。
点击此处打印.
返回本页常规视图.
规划您的设计
对于熟悉 SQL 的任何人来说,用于创建设计的语法是非常简单的。然而,对于任何成功的项目而言,成功的设计需要一些初始规划。在创建第一个设计前:
-
熟悉标准设计要求并将您的设计规划为包括这些要求。请参阅设计要求。
-
确定您需要将多少个投影包括在设计中。请参阅确定要使用的投影数量。
-
确定要用于列的压缩和编码类型。请参阅体系结构。
-
确定是否希望数据库具有 K-safe。Vertica 建议所有生产数据库都应至少将 K-safety 设置为 1 (K=1)。有效的 K-safe 值为 0、1 和 2。请参阅K-safety 设计。
1 - 设计要求
物理架构设计是包含 CREATE PROJECTION 语句的脚本。这些语句确定包括在投影中的列及其优化方式。
如果您开始时使用 Database Designer,它将自动创建满足所有基础设计要求的设计。如果您打算手动创建或修改设计,请注意所有设计必须满足以下要求:
-
对于客户端应用程序所使用的数据库中的每个表,每个设计必须至少为其创建一个超投影。这些投影提供全面覆盖,用户可利用该覆盖范围根据需要执行临时查询。它们可以包含联接,而且通常被配置为通过排序顺序、压缩和编码最大限度提高性能。
-
查询特定的投影为可选项。如果您对超投影所提供的性能满意,则无需创建其他投影。但是,可通过优化特定查询工作负载来最大限度提高性能。
-
Vertica 建议所有生产数据库都应至少将 K-safety 设置为一 (K=1) 以支持高可用性和高恢复性。(K-safety 可以设置为 0、1 或 2。)请参阅使用投影的高可用性和 K-safety 设计。
-
如果节点数超过 20 但表为小型表,Vertica 建议您不要创建复制的投影。如果创建复制的投影,编录会变得非常大,而且性能可能会降低。相反,请考虑对这些投影分段。
2 - 确定要使用的投影数量
在许多情况下,由一组超投影(及其伙伴实例)组成的设计可通过压缩和编码提供令人满意的性能。当已使用投影的排序顺序最大限度提高一个或多个查询谓语(WHERE 子句)的性能时,情况尤其如此。
但是,您可能希望添加其他查询特定投影以提高运行缓慢、经常使用或作为业务关键报告的一部分运行的查询的性能。您创建的其他投影(及其伙伴实例)的数量应由以下项目决定:
-
组织需求
-
群集中每个节点上的可用磁盘空间量
-
将数据加载到数据库中的可用时间量
随着针对特定查询而优化的投影数量的增加,这些查询的性能得到提高。但是,已用磁盘空间量和加载数据所需的时间量也会增加。因此,应创建和测试设计以确定您的数据库配置的最佳投影数量。平均而言,选择实施查询特定投影的组织可通过添加几个查询特定投影来实现最佳性能。
3 - K-safety 设计
Vertica 建议所有生产数据库都应至少将 K-safety 设置为 1 (K=1)。生产数据库的有效 K-safety 值为 1 和 2。非生产数据库不必为 K-safe,可将该值设置为 0。
K-safe 数据库必须至少包含三个节点,如下表所示:
- 1
- 3+
- 2
- 5+
注意
Vertica 仅支持 K-safety 级别 1 和 2。
仅当物理架构设计满足某些冗余要求时,才能将 K-safety 设置为 1 或 2。请参阅K-safe 物理架构设计的要求。
使用 Database Designer
要创建具有 K-safe 状态的设计,Vertica 建议您使用
Database Designer。使用 Database Designer 创建投影时,建议使用满足 K-safe 设计要求的投影定义并用 K-safety 级别加以标记。Database Designer 会创建一个脚本,该脚本使用
MARK_DESIGN_KSAFE
函数将物理架构的 K-safety 设置为 1。例如:
=> \i VMart_Schema_design_opt_1.sql
CREATE PROJECTION
CREATE PROJECTION
mark_design_ksafe
----------------------
Marked design 1-safe
(1 row)
默认情况下,当数据库的 K-safety 大于 0 时,Vertica 会创建 K-safe 超投影。
监控 K-safety
监控表可以通过编程方式访问,以启用外部操作,例如警报。通过查询
SYSTEM
表内 DESIGNED_FAULT_TOLERANCE
和 CURRENT_FAULT_TOLERANCE
列中的设置,可以监控 K-safety 级别。
K-safety 丢失
当群集中的 K 个节点出现故障时,数据库将继续运行,但性能会受到影响。如果故障节点的数据无法从群集中另一个正常工作的节点中获取,那么后续节点故障可能会导致数据库关闭。
另请参阅
企业模式数据库中的 K-safety
3.1 - K-safe 物理架构设计的要求
Database Designer 使用值为 1 的 K-safety 为至少包含三个节点的群集自动生成设计。(如果群集具有一个或两个节点,它将使用值为 0 的 K-safety 生成设计。)您可以修改为三节点(或更大)群集创建的设计,而且 K-safe 要求已设置完毕。
如果您创建自定义投影,物理架构设计必须满足以下要求才能在出现故障时成功恢复数据库:
可使用
MARK_DESIGN_KSAFE
函数确定您的架构设计是否满足 K-safety 的要求。
3.2 - 无 K-safety 的物理架构设计的要求
如果您使用 Database Designer 生成一个您可以修改的全面设计并且您不希望设计具有 K-safe,请将 K-safety 级别设置为 0(零)。
如果您想要从头开始,请执行以下操作为一个不具有 K-safety (K=0) 的有效数据库建立最低投影要求:
-
为
逻辑架构中的每个表至少定义一个
超投影。
-
复制(定义一个完全相同的副本)每个
节点上的每个维度表超投影。
3.3 - 为 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 设计和分段设计。
3.4 - 为 K‑Safety 设计未分段投影
在许多情况下,维度表相对较小,因此您无需将它们分段。相应地,您应该设计一个 K-safe 数据库,以便可以复制其维度表的投影并且无需在所有群集节点上进行分段。您可以使用包括关键字 UNSEGMENTED ALL NODES
的
CREATE PROJECTION
语句创建这些投影。这些关键字用于指定在所有群集节点上创建投影的相同实例。
以下示例展示了如何为表 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)
有关投影名称约定的详细信息,请参阅投影命名。
4 - 分段设计
可使用哈希分段对投影分段。哈希分段可基于内置的哈希函数对投影进行分段。该内置哈希函数可使多个节点中的数据实现正态分布,从而优化查询的执行。在投影中,要进行哈希的数据由一列或多列值组成,每一列都包含大量唯一值,并且值的分布偏移程度在可接受的范围内。满足标准的主键列非常适合进行哈希分段。
分段投影时,确定哪些列用于对投影分段。选择具有大量唯一数据值和在数据分布中可接受的偏离的一个或多个列。主键列是哈希分段的绝佳选择。这些列在查询中所用的所有表上必须唯一。