多行从SQL Server中的表中删除

时间:2009-01-25 21:25:26

标签: sql sql-server

如何从SQL Server 2000中删除1.5百万行,以及完成此任务需要多长时间。

我不想删除表中的所有记录....我只想删除所有满足WHERE条件的记录。

从评论到以下答案的编辑。

“我触发相同的查询,即从table_name中删除Where子句...是否可以在运行的查询中禁用索引,因为查询是从过去20小时开始的..还帮助我如何禁用索引..“

10 个答案:

答案 0 :(得分:5)

如果(并且仅当)要删除表中的所有记录,则可以使用DROP TABLE或TRUNCATE TABLE。

DELETE一次删除一条记录,并在事务日志中为每个已删除的行记录一个条目。 TRUNCATE TABLE更快,因为它不记录事务日志中的活动。它从表中删除所有行,但是表格结构和它的列,约束,索引等仍然存在。 DROP TABLE会删除它们。

如果您决定TRUNCATE,请小心。这是不可逆转的(除非你有备份)。

答案 1 :(得分:3)

创建第二个表,插入第一个不想删除的行。

删除第一个表

将第二个表重命名为第一个

(或以上的变体)

这通常比从大表中删除所选记录更快。

答案 2 :(得分:2)

您可能也想尝试批量删除。我刚刚在一张桌子上测试了这个,删除操作从13秒到3秒。

While Exists(Select * From YourTable Where YourCondition = True)
  Delete Top (100000)
  From   YourTable
  Where  YourCondition = True

如果您运行SQL2000,我认为您不能使用TOP谓词,但它适用于SQL2005及更高版本。如果您使用的是SQL2000,那么您可以使用以下语法:

Set RowCount 100000
While Exists(Select * From YourTable Where YourCondition = True)
   Delete 
   From YourTable
   Where  YourCondition = True

答案 3 :(得分:1)

DELETE FROM table WHERE a=b;

删除那么多行时,您可能希望禁用索引,以便在每次删除时都不会更新。在每次删除时重写索引都会显着减慢整个过程。

您需要在开始删除之前禁用这些索引,否则可能已经存在表锁。

--Disable Index
ALTER INDEX [IX_MyIndex] ON MyTable.MyColumn DISABLE

--Enable Index
ALTER INDEX [IX_MyIndex] ON MyTable.MyColumn REBUILD

如果您想删除表格中的所有条目,可以使用TRUNCATE。

答案 4 :(得分:1)

您要删除的表是否有多个外键,或级联删除或触发器?所有这些都会影响性能。

根据您要执行的操作和事务完整性,您可以删除小批量的内容,例如如果你试图删除150万条1年的数据记录,你能一次做1周吗?

答案 5 :(得分:0)

表中删除 其中 这些150万行的条件

时间取决于。

答案 6 :(得分:0)

在Oracle上,也可以使用

truncate table <table>

不确定这是标准SQL还是SQL Server中可用。但是它会清除整个表格 - 但它比“删除”更快(它也会进行提交)。

答案 7 :(得分:0)

TRUNCATE也会忽略表上的任何参照完整性或触发器。 DELETE FROM ...哪里都会尊重。时间取决于条件列,硬件和任何其他系统负载的索引。

答案 8 :(得分:0)

删除SQL与普通SQL删除

完全相同

从表中删除[您的条件]

然而,如果你担心时间,我会假设你的问题比这更深一些。如果您的表具有大量非聚集索引,那么在某些情况下,首先删除所有这些索引并在删除后重建可能会更快。这个 不寻常,但如果您的直接删除容易受到超时问题的影响,那么可能会有所帮助

答案 9 :(得分:0)

CREATE TABLE new_table as select <data you want to keep> from old_table;

index new_table
grant on new table
add constraints on new_table
etc on new_table

drop table old_table
rename new_table to old_table;