2017-05-28 82 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時,像寫入觸發器將數據移動到存檔一樣。

不需要第二調度器。