批量删除(截断vs删除)

时间:2009-11-20 20:15:55

标签: sql sql-server performance truncate bulk

我们有一张包含1.5亿条记录的表格。我们需要清除/删除所有行。由于写入t-logs而删除操作将永远需要,我们无法更改整个数据库的恢复模型。我们测试了truncate table选项。

我们意识到truncate会从表中释放页面,如果我没有错,则可以将它们重用,但不会自动缩小db。因此,如果我们想减小数据库大小,我们真的需要在截断表之后运行shrink db命令。

这是正常程序吗?我们需要小心或意识到什么,或者有更好的选择吗?

6 个答案:

答案 0 :(得分:1)

删除所有行”...不会 DROP TABLE (并重新重新创建一个具有相同架构/索引的空行)? (我个人喜欢“新鲜的开始”;-))

这说TRUNCATE TABLE也很好,是的,如果你想恢复空间,可能需要DBCC SHRINKFILE。

答案 1 :(得分:1)

truncate正是您正在寻找的。如果您之后需要减小db,请运行收缩。

这个MSDN refernce(如果你说的是T-SQL)比较删除行与截断的幕后。

答案 2 :(得分:0)

使用Truncate Table(以及drop table)要记住的一件事是,如果您有外键引用该表,这将无效。

答案 3 :(得分:0)

根据完整数据库的大小,缩小可能需要一段时间;如果它在较小的块中缩小,我发现它会更快,而不是试图一次性恢复它。

答案 4 :(得分:0)

您有一个正常的解决方案(truncate + shrink db)来删除表中的所有记录。

欧文指出。 TRUNCATE命令在被外键约束引用时不起作用。因此,首先删除约束,截断表并重新创建约束。

如果您担心性能 ,这是您系统的常规例程。您可能希望查看将此表移动到其自己的数据文件,然后仅针对目标数据文件运行收缩!

答案 5 :(得分:0)

正如所指出的,如果你不能使用truncate或drop

SELECT 1
WHILE @@ROWCOUNT <> 0
    DELETE TOP (100000) MyTable