Chèn vào các bảng tạm thời được lập chỉ mục trên các cột tham gia cũng có thể cải thiện mọi thứ như inserted
và deleted
không được lập chỉ mục.
Bạn có thể kiểm tra @@ROWCOUNT
bên trong trình kích hoạt, vì vậy bạn chỉ thực hiện logic này trên một số ngưỡng số hàng mặc dù trên SQL Server 2008, điều này có thể hơi phóng đại con số nếu trình kích hoạt được kích hoạt do kết quả của MERGE
câu lệnh (Nó sẽ trả về tổng số hàng bị ảnh hưởng bởi tất cả MERGE
các hành động không chỉ có liên quan đến trình kích hoạt cụ thể đó).
Trong trường hợp đó, bạn chỉ có thể thực hiện một số việc như SELECT @NumRows = COUNT(*) FROM (SELECT TOP 10 * FROM INSERTED) T
để xem liệu ngưỡng có được đáp ứng hay không.
Bổ sung
Một khả năng khác mà bạn có thể thử nghiệm đơn giản là bỏ qua trình kích hoạt cho các bản cập nhật lớn này. Bạn có thể sử dụng SET CONTEXT_INFO
để đặt cờ và kiểm tra giá trị của giá trị này bên trong trình kích hoạt. Sau đó, bạn có thể sử dụng OUTPUT inserted.*, deleted.*
để nhận các giá trị "trước" và "sau" cho một hàng mà không cần JOIN
ở tất cả.
DECLARE @TriggerFlag varbinary(128)
SET @TriggerFlag = CAST('Disabled' AS varbinary(128))
SET CONTEXT_INFO @TriggerFlag
UPDATE YourTable
SET Bar = 'X'
OUTPUT inserted.*, deleted.* INTO @T
/*Reset the flag*/
SET CONTEXT_INFO 0x