在SQL Server中从表中删除多行

在SQL Server中从表中删除多行,sql,sql-server,Sql,Sql Server,如何从SQL Server 2000中删除150万行,以及完成此任务需要多少时间 我不想删除表中的所有记录。。。。我只想删除所有满填充条件的记录 从注释编辑为下面的答案 “我启动了相同的查询,即使用Where子句从表名称中删除…是否可以在运行查询时禁用索引,因为查询是从过去20小时开始进行的..还请帮助我如何禁用索引..”从表中删除150万行的Where条件 时间视情况而定。在Oracle上,也可以使用 truncate table <table> 截断表 不确定这是标准SQL还

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


我不想删除表中的所有记录。。。。我只想删除所有满填充条件的记录

从注释编辑为下面的答案


“我启动了相同的查询,即使用Where子句从表名称中删除…是否可以在运行查询时禁用索引,因为查询是从过去20小时开始进行的..还请帮助我如何禁用索引..”

从表中删除150万行的Where条件


时间视情况而定。

在Oracle上,也可以使用

truncate table <table>
截断表
不确定这是标准SQL还是在SQL Server中可用。不过,它将清除整个表,但比“从中删除”(它还将执行提交)要快。

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

DELETE一次删除一条记录,并在事务日志中为每个删除的行记录一个条目。 TRUNCATE表速度更快,因为它不在事务日志中记录活动。它删除表中的所有行,但保留表结构及其列、约束、索引等。放下桌子就可以把它们拿走


如果决定截断,请小心。它是不可逆的(除非您有备份)。

TRUNCATE还将忽略表上的任何引用完整性或触发器。从…中删除。。。哪里会尊重两者。时间将取决于条件列的索引、硬件和任何额外的系统负载。

创建第二个表,插入第一个表中不希望删除的所有行

删除第一个表

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

(或上述内容的变更)

这通常比从大表中删除选定的记录要快

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。

删除SQL与普通SQL删除完全相同

从表中删除[您的条件]


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

您也可以尝试批量删除。我刚刚在我拥有的一个表上测试了这个,删除操作从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年的数据,您是否可以一次删除1周?

创建新表作为从旧表中选择;
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;
索引新表 格兰特在新桌子上 在新表上添加约束 新桌子上的etc 放下旧桌子 将新_表重命名为旧_表;
我知道。。。但是想知道删除或完成查询需要多少时间。。谢谢您是否要删除所有记录?我不想删除表中的所有记录。。。。我只想删除所有正在填充WHERE条件的记录……时间长短取决于必须检查多少个相关表、是否执行级联删除、表上是否有触发器,以及其他因素,例如服务器的性能规格和访问表的其他用户数。在这样的论坛上是无法回答的。我发出了相同的查询,即使用Where子句从表_名称中删除。。。是否可以在运行查询时禁用索引,因为查询是从过去20小时开始进行的。。另外,请帮助我如何禁用索引…我是否可以在查询的运行阶段禁用inxing您可能希望取消查询。20小时前,我使用“从表名删除”和“从何处删除”条件启动了查询。。查询仍在进行中。。。要花多少时间才能完成。。。。。是否有机会在正在运行的查询中禁用索引可能是因为日志。。。您可以将日志记录更改为“简单”,然后执行删除,并在删除完成后将日志记录更改回原处。这会更快。这没有回答他的问题。它回答了最初提出的问题。它还为其他感兴趣的读者提供信息,这些读者有着相似但不完全相同的情况。一个人永远不知道自己何时会给出答案,是否会改变原来的问题,是吗?非常感谢,伙计,但如果你能建议我在过去20小时前运行查询时应该做什么,那就好了。。。我是否应该取消查询取消查询可能需要20小时,因为它可能会回滚您的事务。我不太确定,但我认为SQL将在服务器重新启动后继续回滚。SQL Server内置了很多智能功能,可以确保数据的完整性。