管理合并的行数 - Amazon Redshift

管理合并的行数

如果 vacuum 操作需要将新行合并到表的已排序区域,vacuum 所需的时间将随表的增大而增多。您可以通过减少必须合并的行数来提高 vacuum 性能。

在执行 vacuum 操作之前,表包含一个已排序区域(位于表开头处),后跟一个未排序区域(当添加或更新行时,该区域将增大)。如果 COPY 操作添加一组行,则这组新行在添加到表结尾处的未排序区域时将基于排序键进行排序。新行将在其自己的集合中进行排序,而不是在未排序区域内进行排序。

下图说明了两次连续 COPY 操作后的未排序区域,其中排序键为 CUSTID。为简便起见,此示例显示一个复合排序键,但相同的原则适用于交错排序键,只不过未排序区域对交错表的影响更大。

Vacuum 将按两个阶段还原复表的排序顺序:

  1. 将未排序区域归入新排序的区域。

    第一个阶段的成本相对较低,因为仅重写未排序区域。如果新排序区域的排序键值的范围大于现有范围,则仅需要重写新行即可完成 vacuum。例如,如果已排序区域包含的 ID 值介于 1 和 500 之间,并且后续复制操作将添加大于 500 的键值,则仅需重写未排序区域。

  2. 将新排序的区域与之前排序的区域合并。

    如果新排序的区域中的键与已排序区域中的键重叠,则 VACUUM 需要合并这些行。从新排序区域(最低排序键处)的开头开始,vacuum 会将从之前排序的区域和新排序的区域中的合并行写入一组新数据块。

新排序键范围与现有排序键重叠的程度将决定之前排序的区域需要被重写的程度。如果未排序键遍布于现有排序范围中,则 vacuum 可能需要重写表的现有部分。

下图说明 vacuum 如何对添加到排序键为 CUSTID 的表中的行进行排序和合并。由于每个复制操作将添加一组键值与现有键重叠的新行,因此几乎需要重写整个表。该图显示单一排序和合并,但在实践中,大型 vacuum 包含一系列增量排序和合并步骤。

如果一组新行中的排序键范围与现有键的范围重叠,则合并阶段的成本将继续随表的增大与表大小成比例的增长,而排序阶段的成本与未排序区域的大小成正比。在这种情况下,合并阶段的成本远远超过排序阶段的成本,如下图所示。

要确定已重新合并的表的比例,请在 vacuum 操作完成后查询 SVV_VACUUM_SUMMARY。以下查询表明,在 CUSTSALES 随时间的推移而增大时,六个连续 vacuum 操作的效果。

select * from svv_vacuum_summary where table_name = 'custsales'; table_name | xid | sort_ | merge_ | elapsed_ | row_ | sortedrow_ | block_ | max_merge_ | | partitions | increments | time | delta | delta | delta | partitions -----------+------+------------+------------+------------+-------+------------+---------+--------------- custsales | 7072 | 3 | 2 | 143918314 | 0 | 88297472 | 1524 | 47 custsales | 7122 | 3 | 3 | 164157882 | 0 | 88297472 | 772 | 47 custsales | 7212 | 3 | 4 | 187433171 | 0 | 88297472 | 767 | 47 custsales | 7289 | 3 | 4 | 255482945 | 0 | 88297472 | 770 | 47 custsales | 7420 | 3 | 5 | 316583833 | 0 | 88297472 | 769 | 47 custsales | 9007 | 3 | 6 | 306685472 | 0 | 88297472 | 772 | 47 (6 rows)

merge_increments 列指明了为每个 vacuum 操作合并的数据量。如果连续 vacuum 操作的合并增量的数量按表大小增长的比例增加,它表示每个 vacuum 操作重新合并的表中的行数正在增加,因为现有排序区域和新排序区域重叠。