La inserción en tablas temporales indexadas en las columnas de unión podría mejorar las cosas como inserted
y deleted
no están indexados.
Puede verificar @@ROWCOUNT
dentro del disparador, por lo que solo realiza esta lógica por encima de un número de umbral de filas, aunque en SQL Server 2008 esto podría exagerar un poco el número si el disparador se activó como resultado de un MERGE
(Devolverá el número total de filas afectadas por todas las MERGE
acciones no solo la relevante para ese activador específico).
En ese caso, puede hacer algo como SELECT @NumRows = COUNT(*) FROM (SELECT TOP 10 * FROM INSERTED) T
para ver si se alcanza el umbral.
Adición
Otra posibilidad con la que podría experimentar es simplemente omitir el desencadenante de estas grandes actualizaciones. Podrías usar SET CONTEXT_INFO
para establecer una bandera y verificar el valor de esto dentro del disparador. Luego podría usar OUTPUT inserted.*, deleted.*
para obtener los valores "antes" y "después" de una fila sin necesidad de JOIN
en absoluto.
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