我有一个很大的数据表。 该表中有 1000 万条记录。
此查询的最佳方式是什么
Delete LargeTable where readTime < dateadd(MONTH,-7,GETDATE())
最佳答案
如果要删除该表中的所有行,最简单的选项是截断表,例如
TRUNCATE TABLE LargeTable GO
截断表只会清空表,您不能使用 WHERE 子句来限制被删除的行,并且不会触发任何触发器。
另一方面,如果您要删除超过 80-90% 的数据,假设您总共有 1100 万行,并且您想要删除 1000 万行,另一种方法是插入这 100 万行(您想要保留的记录)到另一个临时表。截断这个大表并插入回这 100 万行。
或者,如果以这个大表作为其基础表的权限/ View 或其他对象不会因删除此表而受到影响,您可以将这些相对少量的行放入另一个表中,然后删除此表并创建另一个具有相同架构的表,并将这些行导入回这个前大型表中。
我能想到的最后一个选择是将数据库的
恢复模式更改为 SIMPLE
,然后使用 while 循环小批量删除行,如下所示:DECLARE @Deleted_Rows INT; SET @Deleted_Rows = 1; WHILE (@Deleted_Rows > 0) BEGIN -- Delete some small number of rows at a time DELETE TOP (10000) LargeTable WHERE readTime < dateadd(MONTH,-7,GETDATE()) SET @Deleted_Rows = @@ROWCOUNT; END
并且不要忘记将恢复模式更改回完整模式,我认为您必须进行备份才能使其完全有效(更改或恢复模式)。
关于sql-server - 如何在没有日志的情况下删除SQL表中的大数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24213299/