删除SQL Server 2005记录而不记录日志

时间:2010-03-05 05:43:20

标签: sql-server sql-server-2005

如何从SQL Server 2005表中删除记录而不将其记录到事务日志中。

我不想记录,因为一旦删除,将永远不再需要这些记录。

目前各种删除都需要花费太多时间。是否有其他选项可以提高删除语句的性能?我不能使用truncate,因为需要where子句。

7 个答案:

答案 0 :(得分:16)

很简单:

DECLARE @BatchSize INT
SET @BatchSize = 100000

WHILE @BatchSize <> 0
BEGIN
    DELETE TOP (@BatchSize)
    FROM [dbo].[UnknownTable]
    SET @BatchSize = @@rowcount
END  

答案 1 :(得分:6)

我认为您在数据库中混淆了事务日志的概念。事务日志的主要功能不是用于恢复旧行 - 它的工作是保持数据库的一致性。所有修改都通过事务日志,没有办法解决这个问题。这是好事。事务日志还用于进行数据库的时间点备份和还原,并在两个服务器之间进行镜像时使用。

如果删除的时间过长,则应首先查看几个方面。

1)你有没有在桌面上触发的DELETE触发器?如果是这样,那些可能会导致缓慢。

2)您的DBA是否正确设置了数据库,至少将事务日志和数据文件保存在不同的物理磁盘上?

3)你有很多被检查的外键吗?例如,如果您有另一个表引用要删除的表,则数据库服务器将根据引用表检查每次删除,以确保delete语句不会导致其他表变得不一致。

4)您删除的表上是否有太多索引或索引负担高?每个已删除的行都将对应于每个索引中的条目也被删除,因此请谨慎使用索引。您的索引是否得到妥善维护?

5)找出要删除的行需要很长时间吗?如果DELETE语句中的WHERE子句成本太高,这将真正减慢您的删除速度。尝试暂时将DELETE语句更改为SELECT语句,并查看该查询是否快速运行。如果没有,则应通过编辑,重构表或添加适当的索引来优化SELECT语句。然后将语句更改回DELETE。如果在优化过程中相应的SELECT语句执行得到改善,性能应该得到显着提高。

如果您有一个大型批处理作业对表执行大量删除操作,您可能希望暂时禁用触发器,或者您可能希望在这些大删除批处理之后删除并重新创建索引和外键。这也可以加快速度。

答案 2 :(得分:4)

如果要删除整个表,可以使用TRUNCATE TABLE,它只记录页面解除分配,而不是删除每行的条目。在没有任何事务记录的情况下,我不知道有任何删除方法。

答案 3 :(得分:4)

忘记事务日志作为速度的来源或除了DB内部使用的东西之外的任何东西,以保持一致性。相反,您应该考虑找到一种批量执行删除的方法。而不是单个delete语句,如果表上有一个整数PK,请尝试删除值范围并在循环中执行此操作。像

这样的东西
Declare @RecordsLeft int
Declare @StartRange int
Declare @EndRange int
Declare @BatchSize int

Set @BatchSize = 10000
Set @RecordsLeft = ( Select Count(*) From ... )
Set @StartRange = 0
Set @EndRange = @StartRange + @BatchSize

While @RecordsLeft > 0
Begin
    Delete ...
    Where ...
      And PK Between @StartRange And @EndRange

    Set @RecordsLeft = ( Select Count(*) From ... )
    Set @StartRange = @EndRange + 1
    Set @EndRange = @StartRange + @BatchSize
End

答案 4 :(得分:2)

尝试通过在删除语句之前和之后添加这些语句来删除记录。 traceon(610)traceoff(610)。就像这样

dbcc traceon(610)

--Your Delete Statement
delete statement


dbcc traceoff(610)

答案 5 :(得分:1)

首先,请注意您不能拥有事务日志..如果您在执行大量删除时在服务器中断电会怎么样?需要此信息,以便SQL Server可以执行atomic operations ..

您可能感兴趣的是“恢复模式”。请阅读technet上的这篇文章:http://technet.microsoft.com/en-us/library/ms189275.aspx

答案 6 :(得分:0)

您正在删除内容,但是您有一个where子句,因此有关SQL的常用性能建议适用。

您是否使用过SQL分析器来查看请求的执行计划?如果您记录这些操作,则可以使用性能向导对其进行分析,并建议新的索引。

如果您执行了很多单独的删除语句(删除...其中id = xxx),您可能最好创建一个包含所有ID的临时表,并将此临时表连接到一个删除语句。