此部分包含 Vertica 专用的分区管理函数。
分区函数
- 1: CALENDAR_HIERARCHY_DAY
- 2: COPY_PARTITIONS_TO_TABLE
- 3: DROP_PARTITIONS
- 4: DUMP_PROJECTION_PARTITION_KEYS
- 5: DUMP_TABLE_PARTITION_KEYS
- 6: MOVE_PARTITIONS_TO_TABLE
- 7: PARTITION_PROJECTION
- 8: PARTITION_TABLE
- 9: PURGE_PARTITION
- 10: SWAP_PARTITIONS_BETWEEN_TABLES
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
重要
CALENDAR_HIERARCHY_DAY
算法假设大多数表活动都集中在最近的日期。通过将 active‑years 和 active‑months 设置为 ≥ 2 的小数字,可将合并活动隔离到特定日期的容器中,并将开销降至最低。Vertica 建议您对 active‑years 和 active‑months 使用默认设置 2。对于大多数用户来说,这些设置在 ROS 存储和性能之间实现了最佳平衡。
使用
在表分区子句中指定此函数,作为其 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
将分区从一个表复制到另一个表中。这种轻型分区复制可通过在两个表之间初始共享同一个存储来提高性能。完成复制操作后,各表彼此独立。用户对每个表执行操作时不会影响另一个表。这些操作可增加两个表所需的存储总量。
注意
虽然它们共享存储空间,但 Vertica 将这些分区视为独立对象来许可容量。例如,复制 1 TB 分区可能仅占用 1 TB 空间。但您的 Vertica 许可证会将它们视为占用 2 TB 空间的不同对象。这是元函数。您必须在顶级 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‑value 和 max‑range‑value 必须相等。
-
目标表
- 要复制的分区的目标表。 如果该表不存在,Vertica 将根据源表的定义,通过调用
CREATE TABLE
包含LIKE
和INCLUDING PROJECTIONS
子句来创建一个表。该新表会从源表中继承所有权。有关详细信息,请参阅复制表。 -
force‑split
可选的布尔实参,指定如果分区键的范围跨越多个容器或单个容器的某些部分,是否拆分 ROS 容器:
-
true
:根据需要拆分 ROS 容器。 -
false
(默认值):如果必须拆分 ROS 容器以实施此操作,则返回错误。
-
特权
非超级用户,为以下之一:
-
源表和目标表的所有者
-
对源表的 TRUNCATE 权限(如果 force-split 为 true)和 SELECT 权限,对目标表的 INSERT 权限
如果目标表不存在,则必须在目标架构上具有 CREATE 权限以启用表创建。
表属性要求
两个表的以下属性必须完全相同:
-
列定义,其中包括 NULL/NOT NULL 约束
-
分段
-
投影数量
-
投影排序顺序
-
主键和唯一键约束。但是,不必以完全相同的方式启用键约束。有关约束的详细信息,请参阅约束。
注意
如果目标表已启用主键或唯一键约束,并且复制或移动分区会将重复的键值插入到目标表中,那么 Vertica 将回退此操作。 -
检查约束。对于 MOVE_PARTITIONS_TO_TABLE 和 COPY_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
注意
此函数将取代 Vertica 9.0 中已弃用的元函数 DROP_PARTITION。删除指定的表分区键。
这是元函数。您必须在顶级 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‑value 和 max‑range‑value 必须相等。
-
force‑split
可选的布尔实参,指定如果分区键的范围跨越多个容器或单个容器的某些部分,是否拆分 ROS 容器:
-
true
:根据需要拆分 ROS 容器。 -
false
(默认值):如果必须拆分 ROS 容器以实施此操作,则返回错误。
注意
在极少数情况下,DROP_PARTITIONS 与同一 ROS 容器上的合并操作同时执行。因此,此函数无法按指定设置拆分容器,并会返回错误。发生这种情况时,请再次调用 DROP_PARTITIONS。-
特权
以下几项之一:
-
DBADMIN
-
表所有者
-
对表架构的 USAGE 权限和对表的 TRUNCATE 权限
示例
请参阅删除分区。
另请参阅
PARTITION_TABLE4 - DUMP_PROJECTION_PARTITION_KEYS
转储指定投影的分区键。
这是元函数。您必须在顶级 SELECT 语句中调用元函数。
行为类型
易变语法
DUMP_PROJECTION_PARTITION_KEYS( '[[database.]schema.]projection-name')
参数
-
[database.]schema
数据库和架构。默认架构为
public
。如果指定一个数据库,它必须是当前数据库。- projection‑name
- 投影名称
特权
非超级用户:对锚表的 TRUNCATE 权限
示例
下列语句将分别创建表和投影 online_sales.online_sales_fact
和 online_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‑value 和 max‑range‑value 必须相等。
-
目标表
- 分区移动的目标表。 如果该表不存在,Vertica 将根据源表的定义,通过调用
CREATE TABLE
包含LIKE
和INCLUDING PROJECTIONS
子句来创建一个表。该新表会从源表中继承所有权。有关详细信息,请参阅复制表。 -
force‑split
可选的布尔实参,指定如果分区键的范围跨越多个容器或单个容器的某些部分,是否拆分 ROS 容器:
-
true
:根据需要拆分 ROS 容器。 -
false
(默认值):如果必须拆分 ROS 容器以实施此操作,则返回错误。
-
特权
非超级用户,为以下之一:
-
源表和目标表的所有者
-
对源表的 SELECT 和 TRUNCATE 权限,对目标表的 INSERT 权限
如果目标表不存在,则必须在目标架构上具有 CREATE 权限以启用表创建。
表属性要求
两个表的以下属性必须完全相同:
-
列定义,其中包括 NULL/NOT NULL 约束
-
分段
-
投影数量
-
投影排序顺序
-
主键和唯一键约束。但是,不必以完全相同的方式启用键约束。有关约束的详细信息,请参阅约束。
注意
如果目标表已启用主键或唯一键约束,并且复制或移动分区会将重复的键值插入到目标表中,那么 Vertica 将回退此操作。 -
检查约束。对于 MOVE_PARTITIONS_TO_TABLE 和 COPY_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
清除已删除行的表分区。类似 PURGE
和 PURGE_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‑value 和 max‑range‑value 必须相等。
-
目标表
- 待切换分区的表。目标表不能与临时表相同。
-
force‑split
可选的布尔实参,指定如果分区键的范围跨越多个容器或单个容器的某些部分,是否拆分 ROS 容器:
-
true
:根据需要拆分 ROS 容器。 -
false
(默认值):如果必须拆分 ROS 容器以实施此操作,则返回错误。
-
特权
非超级用户,为以下之一:
-
源表和目标表的所有者
-
目标表和源表:TRUNCATE、INSERT、SELECT
要求
两个表的以下属性必须完全相同:
-
列定义,其中包括 NULL/NOT NULL 约束
-
分段
-
投影数量
-
投影排序顺序
-
主键和唯一键约束。但是,不必以完全相同的方式启用键约束。有关约束的详细信息,请参阅约束。
注意
如果目标表已启用主键或唯一键约束,并且复制或移动分区会将重复的键值插入到目标表中,那么 Vertica 将回退此操作。 -
检查约束。对于 MOVE_PARTITIONS_TO_TABLE 和 COPY_PARTITIONS_TO_TABLE,Vertica 仅在目标表上强制执行已启用的检查约束。对于 SWAP_PARTITIONS_BETWEEN_TABLES,Vertica 会在两个表上强制执行已启用的检查约束。如果违反了已启用的检查约束,Vertica 将回退此操作。
-
文本索引的数量和定义。
此外,如果源表上存在访问策略,则必须满足以下条件:
-
两个表上的访问策略必须相同。
-
以下其中一项必须为真:
-
执行用户拥有目标表。
-
AccessPolicyManagementSuperuserOnly
设置为 true。
-
限制
以下限制适用于源表和目标表:
-
如果源分区和目标分区位于不同的存储层中,Vertica 将返回一个警告,但操作继续进行。分区仍然位于它们的现有存储层中。
-
目标表不能是不可变的。
-
不能将以下表用作源表或目标表:
-
临时表
-
虚拟表
-
系统表
-
外部表
-
示例
请参阅交换分区。