Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Powolne łączenie na wstawionych/usuniętych tabelach wyzwalaczy

Wstawianie do tymczasowych tabel zindeksowanych na łączących się kolumnach może dobrze poprawić sytuację, ponieważ inserted i deleted nie są indeksowane.

Możesz sprawdzić @@ROWCOUNT wewnątrz wyzwalacza, aby wykonać tę logikę tylko powyżej pewnej progowej liczby wierszy, chociaż w SQL Server 2008 może to nieco zawyżać liczbę, jeśli wyzwalacz został uruchomiony w wyniku MERGE oświadczenie (Zwróci całkowitą liczbę wierszy, na które ma wpływ wszystkie MERGE działania, a nie tylko te związane z konkretnym wyzwalaczem).

W takim przypadku możesz po prostu zrobić coś takiego jak SELECT @NumRows = COUNT(*) FROM (SELECT TOP 10 * FROM INSERTED) T aby sprawdzić, czy próg został osiągnięty.

Dodanie

Inną możliwością, z którą możesz poeksperymentować, jest po prostu ominięcie wyzwalacza dla tych dużych aktualizacji. Możesz użyć SET CONTEXT_INFO ustawić flagę i sprawdzić wartość tego wewnątrz wyzwalacza. Następnie możesz użyć OUTPUT inserted.*, deleted.* aby uzyskać wartości "przed" i "po" dla wiersza bez konieczności JOIN w ogóle.

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak uzyskać rozmiar pola varchar[n] w jednej instrukcji SQL?

  2. Połącz się z SQL Server przez PDO za pomocą sterownika SQL Server

  3. Co najlepiej sprawdzić, czy element istnieje, czy nie:Wybierz Count(ID)OR Exist(...)?

  4. Co to jest we/wy STATYSTYKI w programie SQL Server?

  5. Instalacja klastra pracy awaryjnej serwera SQL -3