我们有一个包含 150+ 百万条记录的表。我们需要清除/删除所有行。由于写入 t-logs,删除操作将永远持续下去,我们无法更改整个数据库的恢复模式。我们已经测试了 truncate table 选项。
我们意识到 truncate 会从表中释放页面,如果我没记错的话,可以使它们可用于重用,但不会自动缩小数据库。因此,如果我们想减小 DB 大小,我们确实需要在截断表后运行 shrink db 命令。
这是正常程序吗?有什么我们需要小心或注意的,还是有更好的选择?
我们有一个包含 150+ 百万条记录的表。我们需要清除/删除所有行。由于写入 t-logs,删除操作将永远持续下去,我们无法更改整个数据库的恢复模式。我们已经测试了 truncate table 选项。
我们意识到 truncate 会从表中释放页面,如果我没记错的话,可以使它们可用于重用,但不会自动缩小数据库。因此,如果我们想减小 DB 大小,我们确实需要在截断表后运行 shrink db 命令。
这是正常程序吗?有什么我们需要小心或注意的,还是有更好的选择?
“删除所有行”...... DROP TABLE (并重新创建一个具有相同架构/索引的空表)不是更可取吗?(我个人喜欢“新的开始” ;-))
这说 TRUNCATE TABLE 也很好,是的,如果你想恢复空间,之后可能需要 DBCC SHRINKFILE。
truncate
就是你要找的。如果您之后需要缩小数据库,请运行收缩。
这个MSDN 参考(如果您在谈论 T-SQL)比较了删除行与截断的幕后情况。
使用截断表(以及删除表)要记住的一件事是,如果您曾经有外键引用该表,这将不起作用。
根据整个数据库的大小,收缩可能需要一段时间;我发现如果将其缩小为更小的块,它会运行得更快,而不是试图一次将其全部恢复。
您有一个正常的解决方案(截断 + 收缩 db)来删除表中的所有记录。
正如欧文指出的那样。TRUNCATE 命令在被外键约束引用时不起作用。所以首先删除约束,截断表并重新创建约束。
如果您担心性能 ,这是您系统的常规程序。您可能想考虑将此表移动到它自己的数据文件,然后只对目标数据文件运行收缩!
As pointed out, if you can't use truncate or drop
SELECT 1
WHILE @@ROWCOUNT <> 0
DELETE TOP (100000) MyTable