A inserção em tabelas temporárias indexadas nas colunas de junção pode melhorar as coisas conforme
inserted
e deleted
não são indexados. Você pode verificar
@@ROWCOUNT
dentro do gatilho para que você execute essa lógica apenas acima de um número limite de linhas, embora no SQL Server 2008 isso possa superestimar o número um pouco se o gatilho foi acionado como resultado de um MERGE
instrução (Ele retornará o número total de linhas afetadas por todos os MERGE
ações não apenas aquela relevante para aquele gatilho específico). Nesse caso, você pode fazer algo como
SELECT @NumRows = COUNT(*) FROM (SELECT TOP 10 * FROM INSERTED) T
para ver se o limite foi atingido. Adição
Uma outra possibilidade que você pode experimentar é simplesmente ignorar o gatilho para essas grandes atualizações. Você pode usar
SET CONTEXT_INFO
para definir um sinalizador e verificar o valor disso dentro do gatilho. Você pode então usar OUTPUT inserted.*, deleted.*
para obter os valores "antes" e "depois" de uma linha sem precisar JOIN
de forma alguma. 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