5

从长远来看,删除或“停用”行是否更好,或者在什么情况下?

我注意到从表中删除大量行后产生的开销。为什么会发生这种情况,可以做些什么 1)防止它和 2)修复它?

4

2 回答 2

3

如果要删除大量/旧的或存档的历史记录 - 彻底删除它们。

在短期内,对于手动用户级删除,“软删除”通常是首选。手动删除可能不会超过大约 10% 的记录,因此索引有效性将保持较高。

“软删除”还具有管理员可以取消删除错误删除的主要好处,并且事务的引用完整性和引用的详细信息都被愉快地保留了!

对于长期归档/删除,您希望从索引中删除这些记录——并且,除了我倾向于避免的专有和特定于数据库的“条件索引”之外,从表中删除它们是唯一的方法从索引中删除它们。

于 2013-10-22T04:32:19.237 回答
2

对于 SQL 服务器...

我认为重要的是要知道,如果您要删除一个非常大的表的所有记录(意味着很多记录),您需要先截断,然后删除索引。它效率更高。

如果要删除记录的子集,并且应用了索引,请使用 DELETE FROM {table} WHERE {condition} 语法。如果这样做,则必须首先按照依赖层次结构的顺序从依赖表中删除。基本上与插入记录的方式完全相反,首先从非依赖表开始。

具有表依赖层次结构的 DELETE 记录:

依赖/子表(取决于依赖表):

DELETE FROM [table_dependent]; -- "dependent" is a relative term since this may be part of a hierarchy; a FK in this table points to the PK of the [table_independent] table; in a physical database model, this table is sometimes referred to as the child table

依赖/父表:

DELETE FROM [table_independent];  -- "independent" is a relative term since this may be part of a hierarchy; the PK of this table has a FK in a [table_dependent] table; in a physical database model, this is sometimes referred to as the parent table.

笔记:

如果存在层次结构,则应首先删除“最深”从属表中的记录。这意味着该表的索引也必须首先删除。然后,您应该向上处理层次结构,直到到达父表。

插入具有表依赖层次结构的记录:

SET IDENTITY_INSERT [table_independent] ON

INSERT INTO [table_independent]
(
[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_independent] OFF

SET IDENTITY_INSERT [table_dependent] ON

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

SET IDENTITY_INSERT [table_dependent] OFF
于 2015-09-28T07:21:49.937 回答