sql >> Database teknologi >  >> RDS >> Sqlserver

Langsom joinforbindelse på indsatte/slettede triggertabeller

Indsættelse i midlertidige tabeller indekseret på sammenføjningskolonnerne kunne meget vel forbedre tingene som inserted og deleted er ikke indekseret.

Du kan tjekke @@ROWCOUNT inde i triggeren, så du kun udfører denne logik over et tærskeltal af rækker, selvom dette på SQL Server 2008 kan overdrive tallet en smule, hvis triggeren blev udløst som et resultat af en MERGE sætning (Det vil returnere det samlede antal rækker, der er påvirket af alle MERGE handlinger, ikke kun den, der er relevant for den specifikke trigger).

I så fald kan du bare gøre noget som SELECT @NumRows = COUNT(*) FROM (SELECT TOP 10 * FROM INSERTED) T for at se, om tærsklen er nået.

Tilføjelse

En anden mulighed, du kan eksperimentere med, er simpelthen at omgå triggeren for disse store opdateringer. Du kan bruge SET CONTEXT_INFO for at indstille et flag og kontrollere værdien af ​​dette inde i triggeren. Du kan derefter bruge OUTPUT inserted.*, deleted.* for at få "før" og "efter" værdierne for en række uden at skulle JOIN overhovedet.

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



  1. Konverter SQLITE SQL dump-fil til POSTGRESQL

  2. Kan ikke nulstille root-adgangskoden med --skip-grant-tables på ubuntu 16

  3. Beregn en persons alder i SQL

  4. Hvordan indstiller man en standardrække for en forespørgsel, der ikke returnerer rækker?