假设我有一个有 10000000 条记录的表。这两种解决方案有什么区别?
-
删除数据,例如:
DELETE FROM MyTable
-
使用应用程序逐行删除所有数据:
DELETE FROM MyTable WHERE ID = @SelectedID
第一个解决方案是否具有最佳性能?
对日志和性能有什么影响?
如果您需要限制需要删除的行而不执行完全删除,或者您不能使用 TRUNCATE TABLE (例如,该表由 FK 约束引用,或包含在索引视图中),那么您可以这样做分块删除:
DECLARE @RowsDeleted INTEGER
SET @RowsDeleted = 1
WHILE (@RowsDeleted > 0)
BEGIN
-- delete 10,000 rows a time
DELETE TOP (10000) FROM MyTable [WHERE .....] -- WHERE is optional
SET @RowsDeleted = @@ROWCOUNT
END
一般来说,TRUNCATE 是最好的方法,如果可能的话我会使用它。但它并不能适用于所有场景。另请注意,如果有表,TRUNCATE 将重置该表的 IDENTITY 值。
如果您使用的是 SQL 2000 或更早版本,则 TOP 条件不可用,因此您可以使用 SET ROWCOUNT 代替。
DECLARE @RowsDeleted INTEGER
SET @RowsDeleted = 1
SET ROWCOUNT 10000 -- delete 10,000 rows a time
WHILE (@RowsDeleted > 0)
BEGIN
DELETE FROM MyTable [WHERE .....] -- WHERE is optional
SET @RowsDeleted = @@ROWCOUNT
END
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)