SQL Server 2019 列存储索引 - 维护

got*_*tqn 5 sql-server t-sql columnstore sql-server-2019

我在用于日志记录的表上有一个聚集的列存储索引 - 仅插入(但不是批量插入)。当前的表统计是:

  • 3541 百万行
  • 6.6 GB 预留空间

我今天早上通过以下操作看到以下操作sp_whoisactive

ALTER INDEX [...] ON [...].[...] 
REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = COLUMNSTORE_ARCHIVE);
Run Code Online (Sandbox Code Playgroud)

我使用以下查询来检查row_group_id我们有多少行:

SELECT
    tables.name AS table_name,
    indexes.name AS index_name,
    partitions.partition_number,
    dm_db_column_store_row_group_physical_stats.row_group_id,
    dm_db_column_store_row_group_physical_stats.total_rows,
    dm_db_column_store_row_group_physical_stats.deleted_rows,
    dm_db_column_store_row_group_physical_stats.state_desc,
    dm_db_column_store_row_group_physical_stats.trim_reason_desc
FROM sys.dm_db_column_store_row_group_physical_stats
INNER JOIN sys.indexes
ON indexes.index_id = 
    dm_db_column_store_row_group_physical_stats.index_id
AND indexes.object_id = 
    dm_db_column_store_row_group_physical_stats.object_id
INNER JOIN sys.tables
ON tables.object_id = indexes.object_id
INNER JOIN sys.partitions
ON partitions.partition_number = 
    dm_db_column_store_row_group_physical_stats.partition_number
AND partitions.index_id = indexes.index_id
AND partitions.object_id = tables.object_id
Run Code Online (Sandbox Code Playgroud)

我们33831048576行和很少的行来排列组,如下所示:

在此处输入图片说明

问题是我们使用的是标准版(内部部署),并且重建操作没有在线执行并导致大量阻塞。

我以前从未见过这样的问题。几周前,我们已经升级SQL Server 2016 SP1到 SQL Server 2019

我的问题是:

  • 如果只应用插入,应该是操作reorganize并且更快
  • 如果不是,如果我们应用分区,例如在表用于日志记录时以年份为基础,自动化过程是否只会重建最后一个分区的数据

在此处输入图片说明

Dav*_*oft 5

我在用于日志记录的表上有一个聚集的列存储索引 - 仅插入

如果只应用插入,应该是操作重组并且更快

你甚至不应该打扰。为列存储重新组织:

当 10% 或更多的行已被逻辑删除时,从行组中物理删除行。删除的字节会在物理介质上回收。例如,如果一个 100 万行的压缩行组删除了 10 万行,SQL Server 将删除删除的行并重新压缩具有 90 万行的行组。它通过删除已删除的行来节省存储空间。

组合一个或多个压缩的行组以将每个行组的行增加到最多 1,048,576 行。例如,如果您批量导入 5 个批次的 102,400 行,您将获得 5 个压缩的行组。如果您运行 REORGANIZE,这些行组将合并为 1 个大小为 512,000 行的压缩行组。这假设没有字典大小或内存限制。

对于其中 10% 或更多行已被逻辑删除的行组,数据库引擎会尝试将此行组与一个或多个行组组合。例如,行组 1 被压缩为 500,000 行,而行组 21 被压缩为最多 1,048,576 行。行组 21 删除了 60% 的行,剩下 409,830 行。数据库引擎倾向于组合这两个行组以压缩具有 909,830 行的新行组。

特定于重新组织列存储索引的注意事项

所以它要做的就是将打开的行组组合成一个新的压缩行组。然后下次插入任何内容时,您将获得新的打开行组。因此,在您的场景中重新组织没有真正的好处。

正如 JD 所建议的,如果您只想对旧分区应用存档压缩,您可以对这个表进行分区。但是你的压缩已经相当不错了。