Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Бавно присъединяване към вмъкнати/изтрити тригерни таблици

Вмъкването във временни таблици, индексирани в свързващите колони, може да подобри нещата като inserted и deleted не са индексирани.

Можете да проверите @@ROWCOUNT вътре в тригера, така че изпълнявате тази логика само над определен прагов брой редове, въпреки че на SQL Server 2008 това може донякъде да надценява броя, ако тригерът е бил задействан в резултат на MERGE оператор (Ще върне общия брой редове, засегнати от всички MERGE действия, а не само това, което е свързано с конкретния тригер).

В такъв случай можете просто да направите нещо като SELECT @NumRows = COUNT(*) FROM (SELECT TOP 10 * FROM INSERTED) T за да видите дали прагът е достигнат.

Допълнение

Друга възможност, с която можете да експериментирате, е просто да заобиколите тригера за тези големи актуализации. Можете да използвате SET CONTEXT_INFO за да зададете флаг и да проверите стойността на това вътре в тригера. След това можете да използвате OUTPUT inserted.*, deleted.* за да получите стойностите "преди" и "след" за ред, без да е необходимо JOIN изобщо.

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. Намерете колони, които съдържат само нули

  2. Използвайте OBJECTPROPERTY(), за да определите дали даден обект е изглед в SQL Server

  3. Конкатениране на стойностите на редове T-SQL

  4. SQL индекс - Разлика между char и int

  5. Всички причини, поради които не мога да получа достъп до екземпляр на SQL 2005