快速删除超过2天前的行

时间:2012-06-25 09:10:18

标签: sql sql-server sql-server-2008 sql-server-2005

我有一个Web应用程序,它从包含邮件跟踪日志的SQL DB中读取数据,出于性能原因,我希望确保数据库中的日志永远不会超过2天。

通常这是一个简单的挑战,只需用删除语句删除记录吗?

不幸的是,对我来说不那么简单,该表包含数百万的记录计数,而删除语句需要一段时间才能运行。有没有办法让这更快?

我目前正在这样做:

DECLARE @CutOffDate datetime;
SET @CutOffDate = DATEADD(d, -2, GETDATE());

WHILE @@ROWCOUNT > 0
BEGIN
    DELETE TOP (2000) E12_MessageTracking
    WHERE [TimeStamp] < @CutOffDate;

    DELETE TOP (2000) E12_MessageTracking_Recipients
    WHERE [TimeStamp] < @CutOffDate;
END

我经常运行批量插入查询所以我需要能够经常运行删除,但是当前任务在“删除”语句上“超限”并且运行的脚本无法跟上实时。

更新:

这是你们要求的版本信息:

Microsoft SQL Server 2008 R2(RTM) - 10.50.1810.0(X64)2012年2月3日17:19:10版权所有(c)Windows NT 6.1上的Microsoft Corporation标准版(64位)(Build 7600:)(管理程序)

对于索引,表没有PK / FK关系,但它们在名为MessageID的字段上“链接”。问题是MessageID并不总是被填充,所以我使用一个名为InternalMessageID的子字段,它更好地链接。我遇到的一个问题是每条消息的E12_MessageTracking表中有多行,它们链接到E12_MessageTracking_Recipients表。

我希望在这些表之间建立正确的关系,但是现在我无法在不使用预先存在的InternalMessageID或MessageID列的情况下识别与消息相关的所有项目。 / p>

对于索引,它们如下:

E12_MessageTracking

InternalMessageID列上的索引,其中包含为Timestamp和Event

设置的列

E12_MessageTracking_Recipients

InternalMessageID列上的索引,其中包含为Timestamp和Recipient设置的列

谢谢, 克里斯。

1 个答案:

答案 0 :(得分:1)

我要考虑的第一件事是确保表有一个索引,其中TimeStamp是第一个索引列。

更多细节:

如果时间戳不是第一列,并且您的查询没有对前面的列进行过滤,则无法使用索引(想象一下您在知道第一个字母的库中查找一本书第二个词)。

通过查看SSMS中脚本的执行计划,您可以有更好的想法。如果E12_MessageTracking上的查询显示Table Scan,则表示没有使用索引。