2013-10-22 88 views
3

從長遠的角度來看,刪除或「停用」行或在什麼情況下更好?從表中刪除行會如何影響其索引?

我注意到從表中刪除大量行後產生的開銷。爲什麼會發生這種情況,可以做些什麼1)防止它發生,2)修復它?

+0

這是不是一個真正的SQL問題,它很可能取決於在DB上。索引重建時,它可能只是暫時放緩嗎? –

回答

2

如果大容量/舊的或存檔的歷史記錄將被刪除 - 徹底刪除它們。

在近期內,對於手動用戶級刪除,通常首選「軟刪除」。手動刪除可能不會超過記錄的10%左右,因此索引效率仍然很高。

「軟刪除」還具有管理員可以取消刪除錯誤刪除的重大好處,並且參考完整性&交易的參考詳細信息都很愉快地保留!

對於長期歸檔/刪除,您希望從索引中刪除這些記錄 - 除了我傾向於避免的專有數據庫「條件索引」之外,將它們從表中刪除的除了專有的&將它們從索引中移除的唯一方法。

1

對於SQL Server ...

我想知道,如果你刪除所有記錄非常大的表(意味着大量的記錄),你會想先截斷它是非常重要的,再滴索引。它效率更高。

如果要刪除記錄的子集,並且應用了索引,請使用DELETE FROM {table} WHERE {condition}語法。如果這樣做,則必須首先按照依賴關係層次結構的順序從依賴表中刪除。基本上與插入記錄的方式完全相反,首先從非依賴表開始。

刪除記錄與表依賴層次:

DELETE FROM [table_dependent]; -- depends on table [table_non_dependent] because it has a FK that points to [table_non_dependent] 
DELETE FROM [table_non_dependent]; -- not dependent on any other tables because it has no foreign keys (FK) 

插入記錄與表依賴層次:

SET IDENTITY_INSERT [table_non_dependent] ON 

INSERT INTO [table_non_dependent] 
(
[column that is not identity column], 
[column that is not identity column], 
[column that is not identity column] 
) 
VALUES 
(
'1', 
'2', 
'3' 
); 

SET IDENTITY_INSERT [table_non_dependent] OFF 

SET IDENTITY_INSERT [table_dependent] ON 

INSERT INTO [table_dependent] 
(
[column that is not identity column], 
[column that is not identity column], 
[table_non_dependent fk column] 
) 
VALUES 
(
'1', 
'2', 
'3' 
); 

SET IDENTITY_INSERT [table_dependent] OFF 
相關問題