我正在使用 SQL Server 中的聚集列存储索引,对维护数据顺序有疑问。
我理解,默认情况下,聚集列存储索引不对数据进行排序。我见过一种技术,人们:
- 创建聚集行存储索引来对数据进行排序
- 然后使用 DROP_EXISTING 选项创建聚集列存储索引,这将产生具有初始排序数据的聚集列存储索引。
然而,我担心插入新数据时会发生什么。
我的问题是:
- 向该表中插入新数据是否会破坏现有的顺序?
- 如果是这样,有什么方法可以防止这种情况发生或长期维持秩序?
我很感激任何有此场景经验或了解 SQL Server 中列存储索引内部工作原理的人的见解。提前感谢您的帮助!
首先,您不需要顺序,您实际需要的是表中一个字段的对齐(不重叠)最小值和最大值,以便 SQL 服务器可以在不实际打开它的情况下执行段消除,而实现它的方法是对聚集列存储索引的内容进行排序。
是的。插入数据有两种模式 - 大批量插入直接进入行组,小批量(甚至单行)插入进入增量存储。一旦增量存储达到阈值,就会进入关闭状态,元组移动器会将其转换为行组。此行组的最小值和最大值可能不对齐,因此每次都会被扫描。此外,元组移动器可以将小行组合并为更大的行组,修改最小值和最大值,这样这个行组就不会被消除。
不仅插入会打乱顺序。更新是通过删除+插入到 deltastore 来实现的,因此也会执行相同的操作。
你无法阻止它,但是如果你想要重建索引来恢复排序顺序你就错了。 https://learn.microsoft.com/en-us/sql/t-sql/statements/alter-index-transact-sql?view=sql-server-ver16#rebuild--with--rebuild_index_option---n---
实际对数据进行排序的唯一方法就是您描述的技巧。
在 SQL 2022 中有一个选项ORDER,它应该可以帮助 SQL Server 维护顺序,我没有机会测试它,但是有抱怨。
你还能做什么?
您可以将表分成静态分区和活动分区,并且完全不触碰静态分区。
您可以使用分区视图来合并所有静态和活动表。使用此方法,您可以混合列存储和行存储表,可以为活动表和只读表创建不同的索引。
您应该使用什么策略进行维护?
微软没有提供任何不对齐段的衡量标准。他们提供的唯一指标是碎片化
我希望我有针对列存储索引重建或重组的“最佳实践”。