Sql-Server

數以千計的 After Insert 和 Update 觸發器導致性能問題

  • April 27, 2021

我們的一張表上有一個 After Insert 和 Update 觸發器。觸發器基本上生成一個 json 有效負載並將其排入 RabbitMQ 系統。

今天在表上執行了一個大型插入腳本(超過 50,000 個插入)。這種情況尚未經過測試或考慮,現在我們在該數據庫上遇到了性能問題。

我們注意到 RabbitMQ 的記錄在很長一段時間內緩慢流入。即使數據已經存在了一段時間(因為它是 After Trigger)。

似乎 After 觸發器已以某種方式排隊,並且正在非常緩慢地通過系統工作。

After Trigger 事件如何跟踪執行?他們在某個地方排隊嗎?有什麼辦法可以清除它們嗎?

所有觸發器都在生成它們的語句在其中執行的同一事務的範圍內觸發。因此,如果事務INSERT觸發。因此,如果您執行的INSERT執行完成,那麼從該語句觸發的After Insert 觸發器也是如此。INSERT這裡有一些直截了當的資訊和測試來證明這一點:

所以簡而言之,觸發器在呼叫事務的上下文中執行,觸發器中的回滾將回滾呼叫事務。

所以我的猜測是您的原始INSERT文件仍在執行(然後可以中止並回滾),或者問題是在觸發器執行之後和您用來將數據轉儲到 RabbitMQ 的機制之間。

您可以使用sp_WhoIsActive來確定您的INSERT語句是否仍在執行並獲取SPID程序的程序,以便您可以中止它並回滾。要中止,您必須執行KILL 123(其中 123 =SPID您的INSERT)。


旁注,如果插入 50,000 次,您的意思是一條INSERT語句中有 50,000 條記錄,那麼這很小並且應該是高性能的。如果您實際上是指 50,000 個單獨INSERT的語句,那麼這是一個不同的故事,可能需要更長的時間才能完成INSERT.

引用自:https://dba.stackexchange.com/questions/290586