活动和非活动分区

Tuple Mover 假定分区表的所有加载和更新都是针对一个或多个标识为活动的分区。通常,具有最大分区键的分区(通常是最近创建的分区)均视为活动分区。随着分区的老化,其工作负载通常会缩小,并大多变为只读状态。

设置活动分区计数

您可以按优先级的升序指定两个级别的分区表的活动分区数:

  • 配置参数 ActivePartitionCount 将确定数据库中分区表的活动分区数。默认情况下,ActivePartitionCount 设置为 1。Tuple Mover 会将此设置应用于自身未设置活动分区计数的所有表。

  • 通过使用 CREATE TABLEALTER TABLE 设置各个表自身的活动分区计数,可以取代各个表的 ActivePartitionCount。

同一数据库中的分区表可能会受到更新和加载活动的不同分布的影响。当这些差异显著时,某些表设置自己的活动分区计数便可能有了意义。

例如,表 store_orders 按月分区,并通过配置参数 ActivePartitionCount 获取其活动分区计数。如果该参数设置为 1,则 Tuple Mover 会将最近一个月(通常是当前月份)标识为表的活动分区。如果 store_orders 面临当前月份和上一个月的频繁数据活动,您可能希望该表取代此配置参数,将其活动分区计数设置为 2:

ALTER TABLE public.store_orders SET ACTIVEPARTITIONCOUNT 2;

识别活动分区

Tuple Mover 通常将活动分区标识为最近创建的分区。Vertica 使用以下算法来确定哪些分区比其他分区较旧:

  1. 如果分区 X 是在分区 Y 之前创建的,则分区 X 较旧。

  2. 如果分区 X 和 Y 是同时创建的,但分区 X 上次更新是在分区 Y 之前,则分区 X 较旧。

  3. 如果分区 X 和 Y 是同时创建的且上次更新时间相同,则具有较小键的分区较旧。

您可以通过联接系统表 PARTITIONSSTRATA 并查询其投影来获取表的活动分区。例如,以下查询获取投影 store_orders_super 的活动分区:

=> SELECT p.node_name, p.partition_key, p.ros_id, p.ros_size_bytes, p.ros_row_count, ROS_container_count
     FROM partitions p JOIN strata s ON p.partition_key = s.stratum_key AND p.node_name=s.node_name
     WHERE p.projection_name = 'store_orders_super' ORDER BY p.node_name, p.partition_key;
    node_name     | partition_key |      ros_id       | ros_size_bytes | ros_row_count | ROS_container_count
------------------+---------------+-------------------+----------------+---------------+---------------------
 v_vmart_node0001 | 2017-09-01    | 45035996279322851 |           6905 |           960 |                   1
 v_vmart_node0002 | 2017-09-01    | 49539595906590663 |           6905 |           960 |                   1
 v_vmart_node0003 | 2017-09-01    | 54043195533961159 |           6905 |           960 |                   1
(3 rows)

活动分区组

如果表的 partition 子句包括 GROUP BY 表达式,Vertica 会将该表的活动分区计数应用于其最大分区组键,并将该组中的所有分区视为活动分区。如果使用 Vertica 元函数 CALENDAR_HIERARCHY_DAY 对分区进行分组,则最近日期的分区也会按天分组。因此,最大分区组键和最大分区键相同。实际上,这意味着只有最近的分区是活动分区。

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