分区子句
通过表定义中的 PARTITION BY 子句指定表数据的分区:
PARTITION BY partition‑expression [ GROUP BY group‑expression ] [ active‑partition‑count‑expr ]
-
PARTITION BY partition‑expression
- 对于每个表行,解析为从一个或多个表列派生的分区键。
当心
避免对 LONG VARBINARY 和 LONG VARCHAR 列上的表进行分区。这样做会对性能产生不利影响。 -
GROUP BY group‑expression
- 对于每个表行,解析为从分区键派生的分区组键。Vertica 使用组键将分区合并到单独的分区组中。GROUP BY 必须使用与 PARTITION BY 相同的表达式。例如:
...PARTITION BY (i+j) GROUP BY ( CASE WHEN (i+j) < 5 THEN 1 WHEN (i+j) < 10 THEN 2 ELSE 3);
- active‑partition‑count‑expr
- 指定此表的活动分区数量,具体如下:
-
在 CREATE TABLE 的分区子句中:
ACTIVEPARTITIONCOUNT integer
-
在 ALTER TABLE 的分区子句中:
SET ACTIVEPARTITIONCOUNT integer
此设置将取代配置参数 ActivePartitionCount。有关用法的详细信息,请参阅活动和非活动分区。
-
分区要求和限制
PARTITION BY 表达式可以指定叶表达式、函数和运算符。以下要求和限制适用:
- 所有的表投影必须包含表达式引用的所有列;否则 Vertica 将无法解析表达式。
- 表达式可以引用多个列,但是它必须在每一行解析为一个非 null 值。
注意
可以使用函数 ZEROIFNULL 来避免出现 null 相关错误。此函数可以检查 PARTITION BY 表达式中的 null 值并将其评估为 0。例如:CREATE TABLE t1 (a int, b int) PARTITION BY (ZEROIFNULL(a)); CREATE TABLE
- 所有叶表达式都必须为常数或表列。
- 所有其他表达式必须为函数和运算符。以下限制适用于函数: * 必须为 不可变,即在不同时间和区域设置以及其他会话 - 或特定环境条件下返回相同的值。 * 不可以为聚合函数。 * 不可以为 Vertica 元函数。
- 表达式不可以包含查询。
- 表达式不可以包含用户定义的数据类型,如 Geometry。
GROUP BY 表达式不支持 modulo (%) 运算。
示例
以下语句创建 store_orders
表并将数据加载到其中。CREATE TABLE 语句包含一个简单的分区子句,指定按年份对数据进行分区:
=> CREATE TABLE public.store_orders
(
order_no int,
order_date timestamp NOT NULL,
shipper varchar(20),
ship_date date
)
UNSEGMENTED ALL NODES
PARTITION BY YEAR(order_date);
CREATE TABLE
=> COPY store_orders FROM '/home/dbadmin/export_store_orders_data.txt';
41834
当 COPY 将新表数据加载到 ROS 存储中时,Tuple Mover 会将每年的订单划分为单独的分区,且将这些分区合并到 ROS 容器中,以执行表的分区子句。
在这种情况下,Tuple Mover 为加载的数据创建四个分区键(2017、2016、2015 和 2014),并将数据相应划分到单独的 ROS 容器中:
=> SELECT dump_table_partition_keys('store_orders');
... Partition keys on node v_vmart_node0001
Projection 'store_orders_super'
Storage [ROS container]
No of partition keys: 1
Partition keys: 2017
Storage [ROS container]
No of partition keys: 1
Partition keys: 2016
Storage [ROS container]
No of partition keys: 1
Partition keys: 2015
Storage [ROS container]
No of partition keys: 1
Partition keys: 2014
Partition keys on node v_vmart_node0002
Projection 'store_orders_super'
Storage [ROS container]
No of partition keys: 1
Partition keys: 2017
...
(1 row)
当新数据加载到 store_orders
中时,Tuple Mover 会将其合并到适当的分区中,以此根据需要创建新的分区键。