在现有的大型表上创建列存储索引的最有效方法?

Posted

技术标签:

【中文标题】在现有的大型表上创建列存储索引的最有效方法?【英文标题】:Most efficient way to create a Columnstore index on a large, existing table? 【发布时间】:2020-02-26 00:37:09 【问题描述】:

我的数据仓库中有一个包含 300M+ 行的表,非常适合聚集列存储索引,但我不知道如何应用它。

我应该创建一个带有列存储索引的表的空副本,然后将我的数据选择到其中,还是应该删除现有表上的所有普通索引并直接向其中添加列存储索引?

我有 12 个 CPU 内核和 100GB 的 RAM 专用于 SQL Server 2019。我将在维护窗口期间进行更新,并将最大服务器资源分配给此任务。哪种添加索引的方法会更快?

【问题讨论】:

【参考方案1】:

阅读 Microsoft 文档,我似乎将采用第三种方式。从 SQL Server 2016 开始,您不必删除现有索引,实际上它们对 ColumnStore 索引非常有用。

我要做的是在现有的“普通”行存储索引之上创建一个聚集列存储索引而不删除它们,并使用 DROP EXISTING 选项。

启用此选项后,SQL Server 使用现有的 RowStore 索引对 ColumnStore 中的数据进行排序,然后其行为就像常规索引一样。它甚至保留索引的名称并保留所有现有的元数据和统计信息。使用现有索引的执行计划将继续有效。

这样我就不必牺牲我的集群主键和我为某些查询调整的个人索引所获得的单值查找性能,它们只是被合并到列存储中并继续可用的!太棒了!

【讨论】:

以上是关于在现有的大型表上创建列存储索引的最有效方法?的主要内容,如果未能解决你的问题,请参考以下文章

在具有聚集列存储索引的表上创建触发器 - 错误

在具有 350 亿行的列存储索引表上重新创建索引

为啥表上存在主键会显着提高列存储索引的性能?

您如何计算在大型 Postgresql 表上创建索引的时间?

《高性能MySQL》读书笔记之创建高性能的索引

列存储索引中列的顺序在 SQL Server 2012 中是不是重要