分区子句

通过表定义中的 PARTITION BY 子句指定表数据的分区:

PARTITION BY partition‑expression [ GROUP BY group‑expression ] [ active‑partition‑count‑expr ]
PARTITION BY partition‑expression
对于每个表行,解析为从一个或多个表列派生的分区键。
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 值。
  • 所有叶表达式都必须为常数或表列。
  • 所有其他表达式必须为函数和运算符。以下限制适用于函数: * 必须为 不可变,即在不同时间和区域设置以及其他会话 - 或特定环境条件下返回相同的值。 * 不可以为聚合函数。 * 不可以为 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 会将其合并到适当的分区中,以此根据需要创建新的分区键。

另请参阅

分区表