2013-07-10 36 views
2

問候語, 最近,我開始在一個應用程序上工作,其中8個不同的模塊在工作流程的某個點使用同一個表。該表具有5,000行的Replace-Of觸發器(前500和後500行對於所有模塊都是通用的,然後每個模塊都有自己的500行代碼)。 由於模塊的數量將會增長,我希望儘可能使事物保持清晰(並且單獨),所以我想知道是否有將觸發器拆分爲存儲過程的某種最佳實踐,或者我應該把它全部放在一個地點? P.S.從觸發器調用過程並將15+個參數傳遞給它們會有什麼性能損失?SQL Server中的分割觸發器

+0

什麼是SQL Server中的「模塊」?你的意思是不同的數據庫對象或東西? –

+0

我對此感到抱歉。我將'module'稱爲'application module',它由數據庫對象,業務邏輯等組成。假設它是一個管理系統,其中8個不同的應用程序引用一個表。 – CubicsRube

回答

3

銘記的inserted and deleted僞表是從觸發代碼中唯一的訪問,並且它們可以包含行,你面臨兩個選擇:

  • 過程中的行inserteddeleted在RBAR 時尚,能夠標量參數傳遞到存儲過程,或

  • 將來自inserteddeleted的所有數據複製到表變量中,然後根據需要將它們傳遞給過程。

我預計這兩種方法強加一些性能開銷,剛剛從複製

話雖這麼說,這聽起來像太多正在發生內部觸發自己 - 做這一切代碼必須是執行DML語句的同一事務的一部分?如果沒有,請考慮使用某種形式的隊列(例如請求或服務代理表)來放置要執行的工作信息,然後再處理數據 - 如果使用Service Broker,則可以讓它檢查共享消息,然後根據需要向您的每個模塊的專用端點發送適當的消息。

連續被折騰行 - 無論是使用別的東西來模擬一個依次訪問各行cursor - 當在基於集合的語言,如SQL通常皺起了眉頭。

如果不深入瞭解代碼的具體細節並嘗試所有可能的方法並測量結果,多少是不可能知道的。

+0

對不起,延遲迴復,並感謝您的回答! 關於RBAR:首先,我試圖避免遊標,因爲我聽說這是一種不好的做法。其次,我試圖避免對該表進行批量更新,並允許一次只處理一行(因此不需要任何其他技術)。 關於你的Q:不,每個模塊都使用自己的部分代碼。我正在使用GOTO進入和離開部分。 我已經找到解決方案將觸發器分成多個過程,儘管如果發生某些重大更改將會更難以維護。只是在不同的標籤中打開所有的程序是一件痛苦的事情。乾杯:) – CubicsRube

1

我不認爲在這種情況下會有一個有意義的性能損失。

無論如何,把它全部寫入觸發器(當它是5000行長......)是不好的做法。 我認爲主要考慮的是可維護性,這將是更好,如果你把它分解 爲若干SPS