2013-10-22 43 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 
相关问题