Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Junção lenta em tabelas de gatilhos inseridos/excluídos


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