2017-05-28 41 views
0

我们使用一个表作为邮件队列。当需要发送新邮件时,它将被插入到此表中。表中有一个称为状态的字段,其中有一个索引。通过立即删除SQL Server队列优化

脚本每10秒运行一次并检查状态是否为0的新邮件,发送此邮件然后将状态更新为1(实际邮件内容保存为nvarchar(max)列)。

我的问题:立即“清理”表是否有任何好处,即一旦发送电子邮件,将记录复制到不同的“发送”表中并从邮件队列表中删除它?目前我们每个月只进行一次这个清洁程序,每个月除去大约500,000封电子邮件。

回答

1

你必须考虑在这里的几个操作的性能:

  • 电子邮件中选择要发送的
  • 插入的新的电子邮件发送的电子邮件
  • 删除的
  • 更新的已发送电子邮件

立即解决删除问题:如果您没有磁盘空间问题,最快的方法是删除数据将截断整个表格,例如每月一次。

插入性能不应受到选择不同方法的影响 - 插入的时间更多取决于表的可用性(说到锁)和物理结构,而不取决于表的大小。因此,在锁定时,最好不要立即清理这些行(现在只需查看插入内容)。

“已发送”标志的更新是这里最棘手的部分。表的大小起着很大的作用,因为您首先需要选择带有新电子邮件的行,然后在实际发送行后更新该行。我假设你使用游标在循环中逐个发送电子邮件,所以你只需要一条select语句就可以找到所有要发送的项目的ID。如果您在标志列上有非聚集索引,则这不应占用资源。尽管如此,你必须记住保持索引,但这可以在工作时间之外进行。一旦你发送了电子邮件,为了更新标志,你可以使用它的ID访问该行,所以如果你在ID字段上有一个聚集索引(我希望是这种情况),那么它是一个快速操作。

总而言之,我会说你会发现没有好处立即清理表,因为你为了这样做而锁定它,你删除索引并删除选择和更新将不会受益太多从那个方法。

0

如果10秒是合理的时间来运行你的脚本和邮件量是很多,那么你做的是正确的.Beastue发送邮件比清洁表是非常重要的。

清理过程中需要选择 - 插入,选择-delete

既然你说的每month.That 5,00,000记录measn您每月发送此邮件太多。 so per 10 second mail =

select 500000/30,select 16666 /(24 * 60 * 60.0)* 10 = 2 mail approax。

因此,您每10秒发送2封邮件。

我认为你可以一次完成所有操作。当更新状态= 1时,像写入触发器将数据移动到存档一样。

不需要第二调度器。