软删除以提高性能:全错了吗?

Ser*_*ook 2 performance database-design sql-server delete sql-server-2008-r2

几年前我读到软删除会提高删除的性能,因为它不会实际删除项目并影响聚集(和所有其他)索引,它只会改变一个值。

我最近尝试了这个,但我的表现非常令人失望。

所以我在网上搜索了一个很好的软删除实现,我最终阅读的第一件事是文章/博客说“软删除是不好的”。

显然,当桌子变大时,它弊大于利......

我不认为我所做的会使表格变得更大,因为每晚(每天)的维护都会删除(真正的)所有标记为删除的行。

那么,软删除真的不利于性能吗?真正的删除是否会导致整个聚簇表完全重新排序(这将是很多磁盘操作!!!)?

Aar*_*and 7

在某些情况下,软删除并不意味着是永久性的。您可以将删除推迟到某个后台作业(例如,就在您重新组织/重建索引之前),以便原始事务不必等待删除发生(特别是如果您有级联删除、触发器等)。

在其他情况下,软删除根本不是性能要求,而是一种避免永久删除数据的方法,因此它总是有迹可循。在这种情况下,您希望软删除是永久性的。(但是,如果您在某个时候“删除”了大量数据,该表将主要是“已删除”的数据。如果这是模式并且需要永久保留数据,那么您可能会考虑使用存档表来保存已删除的数据行,您也可以将其作为延迟后台任务执行,但仍然只需要原始事务更新标志。)

在这两种情况下,您都可以通过使用过滤索引来提高运行时性能。无法指导您需要包含哪些列,但您可以说:

CREATE INDEX x ON dbo.table(col) INCLUDE(othercol)
WHERE deleted = 0;
Run Code Online (Sandbox Code Playgroud)

这听起来可能违反直觉,但您可能还需要反向索引,以使您的删除操作更快,至少在识别要删除的行方面。在这种情况下,您可能只想要主键:

CREATE INDEX y ON dbo.table(key) WHERE deleted = 1;
Run Code Online (Sandbox Code Playgroud)

请注意,有很多限制: