我在用于记录的表上有一个聚集列存储索引 - 仅插入(但不是批量插入)。当前的表统计数据是:
- 35.41 亿行
- 6.6 GB 预留空间
我今天早上通过以下方式看到了以下操作sp_whoisactive
:
ALTER INDEX [...] ON [...].[...]
REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = COLUMNSTORE_ARCHIVE);
我使用以下查询来检查我们有多少行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
我们在最后一行和几3383
行分组,如下所示:1048576
问题是我们使用的是标准版(本地)并且重建操作没有在线执行并导致大量阻塞。
我以前从未见过这样的问题。几周前,我们已经从SQL Server 2016 SP1
SQL升级Server 2019
。
我的问题是:
- 如果只应用插入,应该是操作
reorganize
并且更快 - 如果不是,如果我们应用分区,例如在表用于日志记录时以年份为基础,自动化过程是否只会重建最后一个分区的数据
你甚至不应该打扰。为列存储重新组织:
特定于重组列存储索引的注意事项
所以它所要做的就是将打开的行组组合成一个新的压缩行组。然后下次插入任何内容时,您将获得新的打开行组。因此,在您的场景中 REORGANIZE 并没有真正的好处。
正如 JD 建议的那样,您可以对该表进行分区,以便仅将归档压缩应用于较旧的分区。但是你的压缩已经很好了。
重组您的索引总是比完全重建更快,而且通常情况下,一个与另一个在性能增益方面的差异是通过重组为您带来更多收益。
如果您使用Partitioning,那么您可以指定要重建和/或重组的分区。分区是分解大型表/索引以提高数据维护任务的性能的一个很好的解决方案。所以是的,您可以选择仅重建/重组最后一个分区,或安排您想要在任何时间间隔维护的任何分区。
我不确定当你说你有“35.41 亿行”时你的意思是 35 亿行,因为 6.6 GB 的保留空间对于这么多行来说非常小,但在我看来,一旦你开始超过大约 50 亿行单个表是分区可能是实施的一个不错的选择。