sql >> Databasteknik >  >> RDS >> Sqlserver

Långsam koppling på infogade/borttagna triggertabeller

Att infoga i temporära tabeller indexerade på sammanfogningskolumnerna kan mycket väl förbättra saker som inserted och deleted är inte indexerade.

Du kan kontrollera @@ROWCOUNT inuti triggern så att du bara utför denna logik över ett tröskelvärde för antal rader, men på SQL Server 2008 kan detta överdriva siffran något om triggern avfyrades som ett resultat av en MERGE uttalande (Det kommer att returnera det totala antalet rader som påverkas av alla MERGE åtgärder som inte bara är relevanta för den specifika utlösaren).

I så fall kan du bara göra något i stil med SELECT @NumRows = COUNT(*) FROM (SELECT TOP 10 * FROM INSERTED) T för att se om tröskeln är uppfylld.

Tillägg

En annan möjlighet du kan experimentera med är att helt enkelt kringgå triggern för dessa stora uppdateringar. Du kan använda SET CONTEXT_INFO för att ställa in en flagga och kontrollera värdet på denna inuti triggern. Du kan sedan använda OUTPUT inserted.*, deleted.* för att få värdena "före" och "efter" för en rad utan att behöva JOIN överhuvudtaget.

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. MYSQL:VÄLJA summan av fältvärden samtidigt som du väljer unika värden?

  2. Förstå SQL Server dödlägesdiagrammet

  3. Rullande dagliga distinkta räkningar

  4. Utveckla PostgreSQL för Windows, del 2