使用 SQL 服务器中的列存储索引提高 table 的性能
Improve performance of table with columnstore index in SQL Server
我有一个相当大的 table(2000 万行),它有一个列存储索引。
当我尝试从中删除部分数据时,删除速度很慢,需要几分钟。
在列存储 table 中加速删除的选项是什么?添加常规索引有助于加快删除速度吗?我知道在列存储中 table 列存储索引已经物理存储在列中,所以我不确定添加更多索引是否有帮助。
第一,2000万条记录不算什么。您不需要为那么少的数据使用列存储;普通指数就可以了。
其次,列式存储,无论如何在MS SQL服务器中,都是只读的。这是设计使然。通过对数据进行分区并一次删除一个部分,您可能会通过删除获得一些改进,但是对 20M 记录进行分区肯定是一种矫枉过正。
更糟糕的是,删除会在列存储组中产生碎片,因为与行存储不同,数据库引擎不会回收空闲 space,直到您 运行 rebuild
/ reorganize
该索引(选择哪个取决于 SQL 服务器版本;查看 ALTER INDEX 了解详情)。
简而言之,只有当行存储不再削减它时才考虑列存储才有意义,这显然不是你的情况(至少现在还不是)。
尝试使用截断而不是删除。我有一个 table 超过 4000 万条记录。 table 上定义了非聚集索引。删除选项并不理想,因为它需要很长时间并且大量使用事务日志。因此我使用 truncate 解决了这个问题。
我有一个相当大的 table(2000 万行),它有一个列存储索引。
当我尝试从中删除部分数据时,删除速度很慢,需要几分钟。
在列存储 table 中加速删除的选项是什么?添加常规索引有助于加快删除速度吗?我知道在列存储中 table 列存储索引已经物理存储在列中,所以我不确定添加更多索引是否有帮助。
第一,2000万条记录不算什么。您不需要为那么少的数据使用列存储;普通指数就可以了。
其次,列式存储,无论如何在MS SQL服务器中,都是只读的。这是设计使然。通过对数据进行分区并一次删除一个部分,您可能会通过删除获得一些改进,但是对 20M 记录进行分区肯定是一种矫枉过正。
更糟糕的是,删除会在列存储组中产生碎片,因为与行存储不同,数据库引擎不会回收空闲 space,直到您 运行 rebuild
/ reorganize
该索引(选择哪个取决于 SQL 服务器版本;查看 ALTER INDEX 了解详情)。
简而言之,只有当行存储不再削减它时才考虑列存储才有意义,这显然不是你的情况(至少现在还不是)。
尝试使用截断而不是删除。我有一个 table 超过 4000 万条记录。 table 上定义了非聚集索引。删除选项并不理想,因为它需要很长时间并且大量使用事务日志。因此我使用 truncate 解决了这个问题。