1 - CALENDAR_HIERARCHY_DAY

指定将 DATE 分区键分成年、月和日的层次结构。Vertica Tuple Mover 会定期根据当前日期评估分区键,并根据需要将分区合并到相应的年份和月份分区组中。

这是元函数。您必须在顶级 SELECT 语句中调用元函数。

行为类型

易变

语法

CALENDAR_HIERARCHY_DAY( partition‑expression[, active‑months[, active‑years] ] )

参数

partition‑expression
用于对分区键分组的 DATE 表达式,必须与表的 PARTITION BY 表达式相同。
active‑months
一个 ≥ 0 的整数,指定将 MONTH(CURRENT_DATE) 前多少个月的唯一分区键存储在单独的分区中。

如果指定为 1,则只将当月的分区键存储在单独的分区中。

如果指定为 0,则将当月的所有分区键合并到该月的分区组中。

有关详细信息,请参阅分层分区

默认值: 2

active‑years
一个 ≥ 0 的整数,指定将 YEAR(CURRENT_DATE) 前多少年的分区键按月份分组到单独的分区中。

如果指定为 1,则只将当年的分区键存储在月份分区组中。

如果指定为 0,则将当前和以前年份的所有分区键合并到年份分区组中。

有关详细信息,请参阅分层分区

默认值: 2

使用

在表分区子句中指定此函数,作为其 GROUP BY 表达式:

PARTITION BY partition‑expression
  GROUP BY CALENDAR_HIERARCHY_DAY(
     group‑expression
      [, active‑months[, active‑years] ] )

例如:

=> CREATE TABLE public.store_orders
(
    order_no int,
    order_date timestamp NOT NULL,
    shipper varchar(20),
    ship_date date
);
...
=> ALTER TABLE public.store_orders
      PARTITION BY order_date::DATE
      GROUP BY CALENDAR_HIERARCHY_DAY(order_date::DATE, 3, 2) REORGANIZE;

有关用法的详细信息,请参阅分层分区

另请参阅

分层分区

2 - COPY_PARTITIONS_TO_TABLE

将分区从一个表复制到另一个表中。这种轻型分区复制可通过在两个表之间初始共享同一个存储来提高性能。完成复制操作后,各表彼此独立。用户对每个表执行操作时不会影响另一个表。这些操作可增加两个表所需的存储总量。

这是元函数。您必须在顶级 SELECT 语句中调用元函数。

行为类型

易变

语法

COPY_PARTITIONS_TO_TABLE (
    '[[database.]schema.]source‑table',
    'min‑range‑value',
    'max‑range‑value',
    '[[database.]schema.]target‑table'
     [, 'force‑split']
)

参数

[database.]schema

数据库和架构。默认架构为 public。如果指定一个数据库,它必须是当前数据库。

source‑table
要复制的分区的源表。
min‑range‑value max‑range‑value
要复制的分区键的最小值和最大值,其中 min‑range‑value 必须 ≤ max‑range‑value。要复制某个分区,min‑range‑valuemax‑range‑value 必须相等。
目标表
要复制的分区的目标表。 如果该表不存在,Vertica 将根据源表的定义,通过调用 CREATE TABLE 包含 LIKEINCLUDING PROJECTIONS 子句来创建一个表。该新表会从源表中继承所有权。有关详细信息,请参阅复制表
force‑split

可选的布尔实参,指定如果分区键的范围跨越多个容器或单个容器的某些部分,是否拆分 ROS 容器:

  • true:根据需要拆分 ROS 容器。

  • false (默认值):如果必须拆分 ROS 容器以实施此操作,则返回错误。

特权

非超级用户,为以下之一:

  • 源表和目标表的所有者

  • 对源表的 TRUNCATE 权限(如果 force-split 为 true)和 SELECT 权限,对目标表的 INSERT 权限

如果目标表不存在,则必须在目标架构上具有 CREATE 权限以启用表创建。

表属性要求

两个表的以下属性必须完全相同:

  • 列定义,其中包括 NULL/NOT NULL 约束

  • 分段

  • 分区子句

  • 投影数量

  • 投影排序顺序

  • 主键和唯一键约束。但是,不必以完全相同的方式启用键约束。有关约束的详细信息,请参阅约束

  • 检查约束。对于 MOVE_PARTITIONS_TO_TABLECOPY_PARTITIONS_TO_TABLE,Vertica 仅在目标表上强制执行已启用的检查约束。对于 SWAP_PARTITIONS_BETWEEN_TABLES,Vertica 会在两个表上强制执行已启用的检查约束。如果违反了已启用的检查约束,Vertica 将回退此操作。

  • 文本索引的数量和定义。

此外,如果源表上存在访问策略,则必须满足以下条件:

  • 两个表上的访问策略必须相同。

  • 以下其中一项必须为真:

    • 执行用户拥有源表。

    • AccessPolicyManagementSuperuserOnly 设置为 true。有关详细信息,请参阅管理访问策略

表限制

以下限制适用于源表和目标表:

  • 如果源分区和目标分区位于不同的存储层中,Vertica 将返回一个警告,但操作继续进行。分区仍然位于它们的现有存储层中。

  • 目标表不能是不可变的

  • 不能将以下表用作源表或目标表:

    • 临时表

    • 虚拟表

    • 系统表

    • 外部表

示例

如果调用 COPY_PARTITIONS_TO_TABLE 且目标表不存在,该函数将自动创建此表。在以下示例中,目标表 partn_backup.tradfes_200801 不存在。 COPY_PARTITIONS_TO_TABLE 创建该表并复制分区。Vertica 还会复制与源表关联的所有约束,外键约束除外。

=> SELECT COPY_PARTITIONS_TO_TABLE (
          'prod_trades',
          '200801',
          '200801',
          'partn_backup.trades_200801');
COPY_PARTITIONS_TO_TABLE
-------------------------------------------------
 1 distinct partition values copied at epoch 15.
(1 row)

另请参阅

存档分区

3 - DROP_PARTITIONS

删除指定的表分区键。

这是元函数。您必须在顶级 SELECT 语句中调用元函数。

行为类型

易变

语法

DROP_PARTITIONS (
    '[[database.]schema.]table‑name',
    'min‑range‑value',
    'max‑range‑value'
    [, 'force‑split']
)

参数

[database.]schema

数据库和架构。默认架构为 public。如果指定一个数据库,它必须是当前数据库。

table‑name
目标表。此表不能用作预联接投影中的维度表,且不能包含过期(未刷新)的投影。
min‑range‑value max‑range‑value
要删除的分区键的最小值和最大值,其中 min‑range‑value 必须 ≤ max‑range‑value。要删除某个分区键,min‑range‑valuemax‑range‑value 必须相等。
force‑split

可选的布尔实参,指定如果分区键的范围跨越多个容器或单个容器的某些部分,是否拆分 ROS 容器:

  • true:根据需要拆分 ROS 容器。

  • false (默认值):如果必须拆分 ROS 容器以实施此操作,则返回错误。

特权

以下几项之一:

  • DBADMIN

  • 表所有者

  • 对表架构的 USAGE 权限和对表的 TRUNCATE 权限

示例

请参阅删除分区

另请参阅

PARTITION_TABLE

4 - DUMP_PROJECTION_PARTITION_KEYS

转储指定投影的分区键。

这是元函数。您必须在顶级 SELECT 语句中调用元函数。

行为类型

易变

语法

DUMP_PROJECTION_PARTITION_KEYS( '[[database.]schema.]projection-name')

参数

[database.]schema

数据库和架构。默认架构为 public。如果指定一个数据库,它必须是当前数据库。

projection‑name
投影名称

特权

非超级用户:对锚表的 TRUNCATE 权限

示例

下列语句将分别创建表和投影 online_sales.online_sales_factonline_sales.online_sales_fact_rep,并将按列 call_center_key 对表数据进行分区:

=> CREATE TABLE online_sales.online_sales_fact
(
    sale_date_key int NOT NULL,
    ship_date_key int NOT NULL,
    product_key int NOT NULL,
    product_version int NOT NULL,
    customer_key int NOT NULL,
    call_center_key int NOT NULL,
    online_page_key int NOT NULL,
    shipping_key int NOT NULL,
    warehouse_key int NOT NULL,
    promotion_key int NOT NULL,
    pos_transaction_number int NOT NULL,
    sales_quantity int,
    sales_dollar_amount float,
    ship_dollar_amount float,
    net_dollar_amount float,
    cost_dollar_amount float,
    gross_profit_dollar_amount float,
    transaction_type varchar(16)
)
PARTITION BY (online_sales_fact.call_center_key);

=> CREATE PROJECTION online_sales.online_sales_fact_rep AS SELECT * from online_sales.online_sales_fact unsegmented all nodes;

下列 DUMP_PROJECTION_PARTITION_KEYS 语句将转储投影 online_sales.online_sales_fact_rep 中的分区键:

=> SELECT DUMP_PROJECTION_PARTITION_KEYS('online_sales.online_sales_fact_rep');

Partition keys on node v_vmart_node0001
  Projection 'online_sales_fact_rep'
   Storage [ROS container]
     No of partition keys: 1
     Partition keys: 200
   Storage [ROS container]
     No of partition keys: 1
     Partition keys: 199
   ...
   Storage [ROS container]
     No of partition keys: 1
     Partition keys: 2
   Storage [ROS container]
     No of partition keys: 1
     Partition keys: 1

 Partition keys on node v_vmart_node0002
  Projection 'online_sales_fact_rep'
   Storage [ROS container]
     No of partition keys: 1
     Partition keys: 200
   Storage [ROS container]
     No of partition keys: 1
     Partition keys: 199
...
(1 row)

另请参阅

5 - DUMP_TABLE_PARTITION_KEYS

转储指定表的所有投影的分区键。

这是元函数。您必须在顶级 SELECT 语句中调用元函数。

行为类型

易变

语法

DUMP_TABLE_PARTITION_KEYS ( '[[database.]schema.]table‑name' )

参数

[database.]schema

数据库和架构。默认架构为 public。如果指定一个数据库,它必须是当前数据库。

table‑name
表的名称

特权

非超级用户:对表的 TRUNCATE 权限

示例

下列示例将创建一个名为 states 的简单表并按状态对数据进行分区:

=> CREATE TABLE states (year INTEGER NOT NULL,
       state VARCHAR NOT NULL)
       PARTITION BY state;
=> CREATE PROJECTION states_p (state, year) AS
       SELECT * FROM states
       ORDER BY state, year UNSEGMENTED ALL NODES;

现在转储表 states 上锚定的所有投影的分区键值:

=> SELECT DUMP_TABLE_PARTITION_KEYS( 'states' );
      DUMP_TABLE_PARTITION_KEYS                                                               --------------------------------------------------------------------------------------------
 Partition keys on node v_vmart_node0001
  Projection 'states_p'
   Storage [ROS container]
     No of partition keys: 1
     Partition keys: VT
   Storage [ROS container]
     No of partition keys: 1
     Partition keys: PA
   Storage [ROS container]
     No of partition keys: 1
     Partition keys: NY
   Storage [ROS container]
     No of partition keys: 1
     Partition keys: MA

 Partition keys on node v_vmart_node0002
...
(1 row)

另请参阅

6 - MOVE_PARTITIONS_TO_TABLE

将分区从一个表移至另一个表。

这是元函数。您必须在顶级 SELECT 语句中调用元函数。

行为类型

易变

语法

MOVE_PARTITIONS_TO_TABLE (
    '[[database.]schema.]source‑table',
    'min‑range‑value',
    'max‑range‑value',
    '[[database.]schema.]target-table'
     [, force‑split]
)

参数

[database.]schema

数据库和架构。默认架构为 public。如果指定一个数据库,它必须是当前数据库。

source‑table
需要移动的分区所在的源表。
min‑range‑value max‑range‑value
要移动的分区键的最小值和最大值,其中 min‑range‑value 必须 ≤ max‑range‑value。要移动某个分区,min‑range‑valuemax‑range‑value 必须相等。
目标表
分区移动的目标表。 如果该表不存在,Vertica 将根据源表的定义,通过调用 CREATE TABLE 包含 LIKEINCLUDING PROJECTIONS 子句来创建一个表。该新表会从源表中继承所有权。有关详细信息,请参阅复制表
force‑split

可选的布尔实参,指定如果分区键的范围跨越多个容器或单个容器的某些部分,是否拆分 ROS 容器:

  • true:根据需要拆分 ROS 容器。

  • false (默认值):如果必须拆分 ROS 容器以实施此操作,则返回错误。

特权

非超级用户,为以下之一:

  • 源表和目标表的所有者

  • 对源表的 SELECT 和 TRUNCATE 权限,对目标表的 INSERT 权限

如果目标表不存在,则必须在目标架构上具有 CREATE 权限以启用表创建。

表属性要求

两个表的以下属性必须完全相同:

  • 列定义,其中包括 NULL/NOT NULL 约束

  • 分段

  • 分区子句

  • 投影数量

  • 投影排序顺序

  • 主键和唯一键约束。但是,不必以完全相同的方式启用键约束。有关约束的详细信息,请参阅约束

  • 检查约束。对于 MOVE_PARTITIONS_TO_TABLECOPY_PARTITIONS_TO_TABLE,Vertica 仅在目标表上强制执行已启用的检查约束。对于 SWAP_PARTITIONS_BETWEEN_TABLES,Vertica 会在两个表上强制执行已启用的检查约束。如果违反了已启用的检查约束,Vertica 将回退此操作。

  • 文本索引的数量和定义。

此外,如果源表上存在访问策略,则必须满足以下条件:

  • 两个表上的访问策略必须相同。

  • 以下其中一项必须为真:

    • 执行用户拥有源表。

    • AccessPolicyManagementSuperuserOnly 设置为 true。有关详细信息,请参阅管理访问策略

表限制

以下限制适用于源表和目标表:

  • 如果源分区和目标分区位于不同的存储层中,Vertica 将返回一个警告,但操作继续进行。分区仍然位于它们的现有存储层中。

  • 目标表不能是不可变的

  • 不能将以下表用作源表或目标表:

    • 临时表

    • 虚拟表

    • 系统表

    • 外部表

示例

请参阅存档分区

另请参阅

7 - PARTITION_PROJECTION

拆分指定投影的 ROS 容器。 PARTITION_PROJECTION 如果在 AHM 时期之前应用了删除,则也会在对 ROS 容器分区时清除数据。

这是元函数。您必须在顶级 SELECT 语句中调用元函数。

行为类型

易变

语法

PARTITION_PROJECTION ( '[[database.]schema.]projection')

参数

[database.]schema

数据库和架构。默认架构为 public。如果指定一个数据库,它必须是当前数据库。

projection
要分区的投影。

特权

  • 表所有者

  • 对架构的 USAGE 权限

示例

在此示例中,PARTITION_PROJECTION 会强制拆分 states_p 投影中的 ROS 容器:

=> SELECT PARTITION_PROJECTION ('states_p');
  PARTITION_PROJECTION
------------------------
 Projection partitioned
(1 row)

另请参阅

8 - PARTITION_TABLE

调用 Tuple Mover,以根据需要重新组织 ROS 存储容器以符合当前分区策略。

这是元函数。您必须在顶级 SELECT 语句中调用元函数。

行为类型

易变

语法

PARTITION_TABLE ( '[schema.]table‑name')

参数

[database.]schema

数据库和架构。默认架构为 public。如果指定一个数据库,它必须是当前数据库。

table‑name
要分区的表。

特权

  • 表所有者

  • 对架构的 USAGE 权限

限制

  • 不能在实时聚合投影或 Top-K 投影的锚表中运行 PARTITION_TABLE

  • 要重新组织存储以符合新策略,请在更改分区 GROUP BY 表达式后运行 PARTITION_TABLE

另请参阅

9 - PURGE_PARTITION

清除已删除行的表分区。类似 PURGEPURGE_PROJECTION,该函数会从物理存储中移除已删除的数据,这样可以重复使用磁盘空间。 PURGE_PARTITION 仅移除 AHM 时期及更早时期的数据。

这是元函数。您必须在顶级 SELECT 语句中调用元函数。

行为类型

易变

语法

PURGE_PARTITION ( '[[database.]schema.]table', partition‑key )

参数

[database.]schema

数据库和架构。默认架构为 public。如果指定一个数据库,它必须是当前数据库。

要清除的已分区的表。
partition‑key
要清除的分区的键。

特权

  • 表所有者

  • 对架构的 USAGE 权限

示例

以下示例列出了表中每个分区已删除行的数量,然后调用 PURGE_PARTITION() 从数据清除已删除的行。

=> SELECT partition_key,table_schema,projection_name,sum(deleted_row_count)
   AS deleted_row_count FROM partitions
   GROUP BY partition_key,table_schema,projection_name
   ORDER BY partition_key;

 partition_key | table_schema | projection_name | deleted_row_count
---------------+--------------+-----------------+-------------------
 0             | public       | t_super         |                 2
 1             | public       | t_super         |                 2
 2             | public       | t_super         |                 2
 3             | public       | t_super         |                 2
 4             | public       | t_super         |                 2
 5             | public       | t_super         |                 2
 6             | public       | t_super         |                 2
 7             | public       | t_super         |                 2
 8             | public       | t_super         |                 2
 9             | public       | t_super         |                 1
(10 rows)
=> SELECT PURGE_PARTITION('t',5); -- Purge partition with key 5.
                            purge_partition
------------------------------------------------------------------------
 Task: merge partitions
(Table: public.t) (Projection: public.t_super)
(1 row)

=> SELECT partition_key,table_schema,projection_name,sum(deleted_row_count)
   AS deleted_row_count FROM partitions
   GROUP BY partition_key,table_schema,projection_name
   ORDER BY partition_key;


 partition_key | table_schema | projection_name | deleted_row_count
---------------+--------------+-----------------+-------------------
 0             | public       | t_super         |                 2
 1             | public       | t_super         |                 2
 2             | public       | t_super         |                 2
 3             | public       | t_super         |                 2
 4             | public       | t_super         |                 2
 5             | public       | t_super         |                 0
 6             | public       | t_super         |                 2
 7             | public       | t_super         |                 2
 8             | public       | t_super         |                 2
 9             | public       | t_super         |                 1
(10 rows)

另请参阅

10 - SWAP_PARTITIONS_BETWEEN_TABLES

在两个表之间切换分区。

这是元函数。您必须在顶级 SELECT 语句中调用元函数。

行为类型

易变

语法

SWAP_PARTITIONS_BETWEEN_TABLES (
    '[[database.]schema.]staging‑table',
    'min‑range‑value',
    'max‑range‑value',
    '[[database.]schema.]target‑table'
     [, force‑split]
)

参数

[database.]schema

数据库和架构。默认架构为 public。如果指定一个数据库,它必须是当前数据库。

临时表
用于切换分区的临时表。
min‑range‑value max‑range‑value
要交换的分区键的最小值和最大值,其中 min‑range‑value 必须 ≤ max‑range‑value。要交换某个分区,min‑range‑valuemax‑range‑value 必须相等。
目标表
待切换分区的表。目标表不能与临时表相同。
force‑split

可选的布尔实参,指定如果分区键的范围跨越多个容器或单个容器的某些部分,是否拆分 ROS 容器:

  • true:根据需要拆分 ROS 容器。

  • false (默认值):如果必须拆分 ROS 容器以实施此操作,则返回错误。

特权

非超级用户,为以下之一:

  • 源表和目标表的所有者

  • 目标表和源表:TRUNCATE、INSERT、SELECT

要求

两个表的以下属性必须完全相同:

  • 列定义,其中包括 NULL/NOT NULL 约束

  • 分段

  • 分区子句

  • 投影数量

  • 投影排序顺序

  • 主键和唯一键约束。但是,不必以完全相同的方式启用键约束。有关约束的详细信息,请参阅约束

  • 检查约束。对于 MOVE_PARTITIONS_TO_TABLECOPY_PARTITIONS_TO_TABLE,Vertica 仅在目标表上强制执行已启用的检查约束。对于 SWAP_PARTITIONS_BETWEEN_TABLES,Vertica 会在两个表上强制执行已启用的检查约束。如果违反了已启用的检查约束,Vertica 将回退此操作。

  • 文本索引的数量和定义。

此外,如果源表上存在访问策略,则必须满足以下条件:

  • 两个表上的访问策略必须相同。

  • 以下其中一项必须为真:

    • 执行用户拥有目标表。

    • AccessPolicyManagementSuperuserOnly 设置为 true。

限制

以下限制适用于源表和目标表:

  • 如果源分区和目标分区位于不同的存储层中,Vertica 将返回一个警告,但操作继续进行。分区仍然位于它们的现有存储层中。

  • 目标表不能是不可变的

  • 不能将以下表用作源表或目标表:

    • 临时表

    • 虚拟表

    • 系统表

    • 外部表

示例

请参阅交换分区