【发布时间】:2012-07-07 06:40:58
【问题描述】:
我有一个庞大的数据库,它每天处理电子邮件流量。在系统中,每天都需要删除一些旧邮件:
Delete from EmailList(nolock)
WHERE EmailId IN (
SELECT EmailId
FROM Emails
WHERE EmailDate < DATEADD([days], -60, GETDATE())
)
它可以工作,但问题是:它需要很长时间才能完成,因此日志文件变得非常大。日志文件大小每天增加超过 100GB。
我想我们可以把它改成
Delete from EmailList(nolock)
WHERE EXISTS (
SELECT EmailId
FROM Emails
WHERE (Emails.EmailId = EmailList.EmailId) AND
(EmailDate < DATEADD([days], -60, GETDATE()))
)
但除此之外,我们还能做些什么来提高性能。最重要的是,减少日志文件的大小?
- EmailId 已编入索引。
【问题讨论】:
-
在 DELETE 上使用 NOLOCK 绝对没有意义。 NOLOCK 不是 DML 操作的有效提示。
-
"EmailId 已编入索引。"在哪个表中?可以发一下查询计划吗?
-
你的数据库的恢复模式是什么?以及您减少日志大小的策略是什么?
-
@Aaron,我有点惊讶 SQL 语句甚至在其中正确解析。我也在想同样的事情。
-
我从 DBA 那里复制了脚本,实际上我不知道 nolock 是从哪里来的。代码是c#,里面没有nolock。对困惑感到抱歉。恢复模式很简单。坦率地说,我什至没有想到 tempDB 可以在短时间内增加这么多。
标签: sql-server database tempdb