sql >> Databáze >  >> RDS >> Sqlserver

Pomalé spojení u vložených/vymazaných spouštěcích tabulek

Vkládání do dočasných tabulek indexovaných na spojovacích sloupcích by mohlo věci vylepšit jako inserted a deleted nejsou indexovány.

Můžete zkontrolovat @@ROWCOUNT uvnitř spouštěče, takže tuto logiku provádíte pouze nad určitým prahovým počtem řádků, i když na serveru SQL Server 2008 to může číslo poněkud nadhodnocovat, pokud byl spouštěč spuštěn v důsledku MERGE (Vrátí celkový počet řádků ovlivněných všemi MERGE akce nejen ty, které jsou relevantní pro daný konkrétní spouštěč).

V takovém případě můžete udělat něco jako SELECT @NumRows = COUNT(*) FROM (SELECT TOP 10 * FROM INSERTED) T abyste zjistili, zda je prahová hodnota splněna.

Přidání

Další možností, se kterou byste mohli experimentovat, je jednoduše obejít spouštěč těchto velkých aktualizací. Můžete použít SET CONTEXT_INFO nastavit příznak a zkontrolovat jeho hodnotu uvnitř spouštěče. Potom můžete použít OUTPUT inserted.*, deleted.* pro získání hodnot "před" a "po" pro řádek bez nutnosti JOIN vůbec.

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. Hibernate spojením dvou tabulek a vytvářením odpovědi json v jarní uklidňující webové službě?

  2. Jak lze řazení objektů do segmentů formulovat jako platný výraz JPQL?

  3. Hodnoty Oracle Sequence nejsou objednány

  4. Postgres Vytvořit pohled s funkcí typu záznamu