Sql-Server

軟刪除以提高性能:都錯了嗎?

  • December 30, 2015

幾年前我讀到軟刪除會提高刪除的性能,因為它不會實際刪除項目並影響集群(和所有其他)索引,它只會改變一個值。

我最近嘗試了這個,我得到了非常令人失望的表現。

所以我在網上搜尋了一個很好的軟刪除實現,我最終閱讀的第一件事是文章/部落格說“軟刪除是不好的”。

顯然,當桌子變大時,弊大於利…

我不認為我所做的事情會使表格變得更大,因為每晚(每天)的維護會(真正地)刪除所有標記為刪除的行。

那麼,軟刪除真的不利於性能嗎?真正的刪除是否會導致整個聚群表被完全重新排序(這將是很多磁碟操作!!!)?

在某些情況下,軟刪除並不意味著永久。您可以將刪除推遲到某個後台作業(例如,在您重新組織/重建索引之前),以便原始事務不必等待刪除發生(特別是如果您有級聯刪除、觸發器等)。

在其他情況下,軟刪除根本不是性能要求,而是一種避免永久刪除數據的方法,因此總是有跡可循。在這種情況下,您希望軟刪除是永久性的。(但是,如果您在某個時候“刪除”了大量數據,則該表將主要是“已刪除”數據。如果這是模式並且需要永久保留數據,那麼您可能會考慮使用存檔表來保存已刪除的數據行,您也可以將其作為延遲後台任務執行,仍然只需要原始事務更新標誌。)

在這兩種情況下,您都可以通過使用過濾索引來提高執行時性能。無法指導您需要包含哪些列,但您可以說:

CREATE INDEX x ON dbo.table(col) INCLUDE(othercol)
WHERE deleted = 0;

這聽起來可能違反直覺,但您可能還需要反向索引,以使您的刪除操作更快,至少在辨識要刪除的行方面。在這種情況下,您可能只需要那裡的主鍵:

CREATE INDEX y ON dbo.table(key) WHERE deleted = 1;

請注意,有許多限制:

引用自:https://dba.stackexchange.com/questions/100518