我有一个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设置的列
谢谢, 克里斯。
答案 0 :(得分:1)
我要考虑的第一件事是确保表有一个索引,其中TimeStamp
是第一个索引列。
更多细节:
如果时间戳不是第一列,并且您的查询没有对前面的列进行过滤,则无法使用索引(想象一下您在知道第一个字母的库中查找一本书第二个词)。
通过查看SSMS中脚本的执行计划,您可以有更好的想法。如果E12_MessageTracking
上的查询显示Table Scan
,则表示没有使用索引。