Eigenlijk heb ik algemene aanbevelingen voor dergelijke zoekopdrachten ontdekt:het idee om SQL Merge of Update te gebruiken is heel slim, maar het mislukt wanneer we veel records moeten bijwerken (d.w.z. 75M ) in een grote en brede tafel (d.w.z. 240M ).
Als we naar het zoekplan van de onderstaande zoekvraag kijken, kunnen we zeggen dat TABLE SCAN
van TABEL1 en laatste MERGE
nemen 90% van de tijd in beslag.
MERGE TABLE1 as Target
USING UTABLE as source
ON Target.record_id = source.record_id
WHEN MATCHED AND (condition) THEN
UPDATE SET Target.columns=source.columns
Dus om MERGE te gebruiken, moeten we:
- Verminder het aantal rijen dat we nodig hebben om bij te werken en geef deze informatie correct door aan SQL Server. Dit kan gedaan worden door
UTABLE
. te maken kleiner of specificeren van aanvullendecondition
dat vernauwt het samen te voegen deel. - Zorg ervoor dat het samen te voegen deel in het geheugen past, anders verloopt de query veel langzamer.
TABLE1
maken twee keer minder verminderde mijn werkelijke zoektijd van 11 uur naar 40 minuten.
Zoals Mark al zei, kun je UPDATE
. gebruiken syntaxis en gebruik WHERE
clausule om het samen te voegen deel te verkleinen - dit geeft dezelfde resultaten. Vermijd ook het indexeren van TABLE1
omdat dit extra werk zal veroorzaken om de index opnieuw op te bouwen tijdens MERGE