哈希分段子句
指定如何对投影数据进行分段,以便在所有群集节点上分布数据。您可以为表和投影指定分段。如果表定义指定了分段,则 Vertica 会将其用于该表的自动投影。
强烈建议使用 Vertica 的
HASH
内置函数,该函数可在整个群集中均匀分布数据,且便于实现最佳查询执行。
语法
SEGMENTED BY expression ALL NODES [ OFFSET offset ]
参数
-
SEGMENTED BY expression
- 常用的 SQL 表达式。哈希分段是首选分段方法。Vertica 建议使用其内置的
HASH
函数,该函数的实参解析为表列。如果使用HASH
之外的表达式,Vertica 会发出警告。分段表达式应指定具有大量唯一数据值和在数据分布中可接受的偏离的列。通常,符合这些条件的主键列适合用于哈希分段。
有关详细信息,请参阅下面的表达式要求。
ALL NODES
- 创建投影时,会自动在所有节点中均匀分布数据。节点顺序是固定的。
-
OFFSET offset
- 基于零的偏移表示在哪个节点上开始分段分布。
此选项对于
CREATE TABLE
和CREATE TEMPORARY TABLE
无效。重要
如果使用
OFFSET
选项为表创建投影,请确保为每个投影段创建足够的副本以满足系统 K-safety;否则,Vertica 会将投影视为不安全,且无法使用它来查询表。通过组合使用
CREATE PROJECTION
语句中的OFFSET
和KSAFE
选项来创建投影,您可以确保 K-safety 合规性。执行此语句时,Vertica 会自动创建必要数量的投影副本。
表达式要求
分段表达式在指定表列时必须按照其在源表中定义的那样进行指定。不支持投影列名称。
以下限制适用于分段表达式:
-
所有叶表达式都必须为常数或
CREATE PROJECTION
的SELECT
列表中的列的列引用。 -
表达式在数据库的整个使用过程中都必须返回相同的值。
-
不允许集合函数。
-
表达式必须返回
0 <= x < 263
范围内的非负INTEGER
值,且值通常均匀分布在该范围内。注意
如果表达式产生超出预期范围的值,例如负值,不会发生错误,并且会将行添加到投影的第一个段。
示例
以下 CREATE PROJECTION
语句将创建投影 public.employee_dimension_super
。它指定包含表 public.employee_dimension
中的所有列。哈希分段子句将调用 Vertica HASH
函数,对列 employee_key
中的投影数据进行分段;此外,它还包括 ALL NODES
子句,指定在群集中的所有节点上均匀分布投影数据:
=> CREATE PROJECTION public.employee_dimension_super
AS SELECT * FROM public.employee_dimension
ORDER BY employee_key
SEGMENTED BY hash(employee_key) ALL NODES;