如何从SQL Server 2000中删除150万行数据?完成这个任务需要多长时间。
我不想删除表中的所有记录...我只想删除满足WHERE条件的所有记录。
根据下面的答案编辑:
“我使用相同的查询,即带有Where条件的删除表名...是否可以在运行查询时禁用索引,因为查询已经进行了20小时。另外,请告诉我如何禁用索引。”
如何从SQL Server 2000中删除150万行数据?完成这个任务需要多长时间。
我不想删除表中的所有记录...我只想删除满足WHERE条件的所有记录。
根据下面的答案编辑:
“我使用相同的查询,即带有Where条件的删除表名...是否可以在运行查询时禁用索引,因为查询已经进行了20小时。另外,请告诉我如何禁用索引。”
如果你想删除一个表中的所有记录,只能使用DROP TABLE或TRUNCATE TABLE。
DELETE每次只能删除一条记录,并且为每个删除的行在事务日志中记录一个条目。TRUNCATE TABLE要快得多,因为它不会在事务日志中记录活动。它会从表中删除所有行,但是表结构及其列、约束、索引等仍然存在。DROP TABLE将删除这些内容。
如果你决定使用TRUNCATE,请谨慎操作。它是不可逆的(除非你有备份)。
创建第二个表格,将第一个表格中不需要删除的所有行插入其中。
删除第一个表格。
将第二个表格重命名为第一个表格。
(或者做出以上操作的变体)
这通常比从大型表格中删除选定记录更快。
您可以尝试分批删除。我刚在我的一个表上测试了这个操作,删除时间从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
你要删除的表是否有多个外键、级联删除或触发器?所有这些都会影响性能。
根据你想要做什么和事务完整性,你可以分批次删除数据吗?例如,如果你要删除150万条记录,那就是一年的数据,你可以每周删除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
从表格中删除符合那1.5百万行的条件
时间取决于。
TRUNCATE 命令还将忽略表中的任何引用完整性或触发器。DELETE FROM ... WHERE 命令将同时遵守这两者。执行时间将取决于您条件列的索引、硬件以及任何额外的系统负载。
删除 SQL 与普通的 SQL 删除完全相同
从表中删除 where [your condition]
但是,如果您担心时间问题,那么我会认为您的问题比这更深入。如果您的表具有大量非聚集索引,则在某些情况下,先删除所有这些索引,然后在删除后重建可能更快。这种情况很少见,但在您的简单删除容易出现超时问题的情况下,可能会有所帮助。
truncate table <table>
不确定那是否为标准 SQL 或可用于 SQL Server。 但它将会 清空整个表格 - 不过它比 "delete from " 更快(它也会进行提交)。
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;