【发布时间】:2019-11-25 08:23:32
【问题描述】:
我有一个相当大的表(2000 万行),它有一个列存储索引。
当我尝试从中删除部分数据时,删除速度很慢,需要几分钟时间。
在列存储表中加快删除速度的选项是什么?添加常规索引是否有助于加快删除速度?我知道在列存储表中列存储索引已经物理存储在列中,所以我不确定添加更多索引是否会有所帮助。
【问题讨论】:
我有一个相当大的表(2000 万行),它有一个列存储索引。
当我尝试从中删除部分数据时,删除速度很慢,需要几分钟时间。
在列存储表中加快删除速度的选项是什么?添加常规索引是否有助于加快删除速度?我知道在列存储表中列存储索引已经物理存储在列中,所以我不确定添加更多索引是否会有所帮助。
【问题讨论】:
首先,2000 万条记录不算什么。你不需要为那几个数据提供列存储;普通索引就可以了。
第二,列式存储,无论如何,在 MS SQL Server 中,都是只读的。这是设计使然。通过对数据进行分区并一次删除一个部分,您可能会在删除方面获得一些改进,但分区 20M 条记录肯定是大材小用。
更糟糕的是,删除会在列存储组中产生碎片,因为与行存储不同,在您为该索引运行 rebuild / reorganize 之前,数据库引擎不会回收可用空间(选择哪一个取决于 SQL Server版本;详情请查看ALTER INDEX)。
简而言之,只有在行存储不再削减列存储时才考虑列存储,而这显然不是您的情况(至少现在还不是)。
【讨论】:
尝试使用截断而不是删除。我有一张包含超过 4000 万条记录的表。该表上定义了非聚集索引。删除选项并不理想,因为它需要很长时间并且大量使用事务日志。因此我使用 truncate 解决了这个问题。
【讨论】: