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 aanvullendeconditiondat vernauwt het samen te voegen deel. - Zorg ervoor dat het samen te voegen deel in het geheugen past, anders verloopt de query veel langzamer.
TABLE1maken 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