sql >> Base de Datos >  >> RDS >> Sqlserver

Unión lenta en tablas de activación insertadas/eliminadas

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