2012-04-18 84 views
1

我的問題主要關注「什麼是最好的表現」,但有點「哲學」說話(如果它有所作爲)......所以讓我們跳吧[TableA]。[ColumnB]存儲需要存在於[TableC] [ColumnD]中的值。 沒有涉及外鍵的答案 - 只是假設他們在這種環境中「不允許」出於任何原因。因爲「情況x,y,z」,[TableA]。[ColumnB]有時會得到[TableC]。[ColumnD]中不存在的值,因爲假設[TableA]從一個存在於運行代碼中的對象作爲「序列化blob」,數據的內存中表示形式以及[ColumnB]值在從[TableC]。[ColumnD]被其他進程刪除之前被填充。無論如何,這只是一個例子,所以不要陷入「爲什麼會發生這種情況」,只是接受它而已。SQL Server - 插入觸發器與每分鐘作業

要「解決」問題,哪種方法最適合這兩種方法:1.在[TableA]上觸發on-INSERT的Trigger,將[ColumnB]更新爲它應該的值(並假設I有一個「壞到好」值的「映射」)。或者,2.每小時/分鐘/運行一個計劃任務更新查詢以將所有可能的「壞」值更改爲其相應的「良好」值。

更一般地說,有什麼更好的性能和/或什麼是最佳實踐:觸發器或定期預定作業?在上下文中,假設[TableA]的數量通常在數十萬行的數量級上,Inserts每次發生10-100條記錄,每隔幾分鐘一次,甚至每天幾次。

+0

謝謝大家!觸發它......我不興奮地在20多個不同的DB上創建一個,但是,這就是生活。 – NateJ 2012-04-18 17:29:46

回答

9

插入。

做觸發器就像回調 - 它們在邏輯上更合理,並且將任何滯後擴展到每個查詢中。做不斷的檢查(稱爲輪詢或定時任務),最終會出現更嚴重的滯後時間。在幾乎所有情況下,使用觸發器/回調函數都是更好的方法,因爲在看似隨機的時間間隔內,添加到每個查詢的滯後時間爲1毫秒比滯後100毫秒要好。

1

觸發器是最佳性能和實踐,因爲它們保持參照完整性並允許服務器針對性能進行優化。

1

觸發器的使用通常是不鼓勵的,但是你的負載很輕,你的情況似乎是一個自然的觸發器情況。考慮使用instead-of trigger來避免在同一行上執行兩次操作(一次插入而不是插入和更新)。它可能是最簡單和最可靠的解決方案(只要你在觸發器中編寫了可靠的代碼,不會導致整個操作崩潰)。

由於您正在考慮批量作業,因此您不關心計時問題。即,對於您的應用程序來說,表格可能在1分鐘甚至1小時內不同步。這是觸發器方法的主要區別,它將保證表格始終保持同步。潛在的時間問題會讓我感到不舒服。從好的一面來看,您不會有觸發器觸發原始插入操作的風險。

如果你走這條路線,請考慮更改跟蹤功能。更改跟蹤將指示自上次檢查以來哪些行已插入,因此您不必爲整個表掃描新記錄。或者,如果您的TableA具有INDENITY主鍵或唯一鍵,則可以實現類似的設計,而無需更改跟蹤功能。

0

你沒有說你正在使用的是哪個版本的SQL Server,但是如果它是2008+,你可以使用Change Data Capture跟蹤你的「主」表的數據變化。然後,定期地,您可以在變更表上運行一個批處理,並在該小處執行所需的任何處理。

+0

看起來有趣;不幸的是,服務器仍然是SQL 2005。我的道歉不包括原本:) – NateJ 2012-04-18 17:27:08