我有一个庞大的数据库,它每天处理电子邮件流量。在系统中,就需要删除一些旧的邮件日常:提高sql删除性能并减少日志文件和tempDB的大小?
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操作的有效提示。 – 2012-07-06 19:19:07
“EmailId已编入索引。”在哪个表格中?你可以发布查询计划吗? – 2012-07-06 19:19:51
你的db的恢复模式是什么?你的减少日志大小的策略是什么? – tschmit007 2012-07-06 19:30:44