got*_*tqn 5 sql-server t-sql columnstore sql-server-2019
我在用于日志记录的表上有一个聚集的列存储索引 - 仅插入(但不是批量插入)。当前的表统计是:
我今天早上通过以下操作看到以下操作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)
我们3383
用1048576
行和很少的行来排列组,如下所示:
问题是我们使用的是标准版(内部部署),并且重建操作没有在线执行并导致大量阻塞。
我以前从未见过这样的问题。几周前,我们已经升级SQL Server 2016 SP1
到 SQL Server 2019
。
我的问题是:
reorganize
并且更快我在用于日志记录的表上有一个聚集的列存储索引 - 仅插入
如果只应用插入,应该是操作重组并且更快
你甚至不应该打扰。为列存储重新组织:
当 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 所建议的,如果您只想对旧分区应用存档压缩,您可以对这个表进行分区。但是你的压缩已经相当不错了。