Vlastně jsem našel obecná doporučení pro takové dotazy:Nápad použít SQL Merge nebo Update je velmi chytrý, ale selže, když potřebujeme aktualizovat mnoho záznamů (tj. 75M ) na velkém a širokém stole (tj. 240 milionů ).
Při pohledu na plán dotazu níže uvedeného dotazu můžeme říci, že TABLE SCAN
z TABLE1 a poslední MERGE
zabírají 90 % času.
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
Abychom tedy mohli použít MERGE, potřebujeme:
- Snižte počet řádků, které potřebujeme k aktualizaci, a správně předejte tyto informace serveru SQL Server. To lze provést nastavením
UTABLE
menší nebo specifikující dalšícondition
která zužuje část, která má být sloučena. - Ujistěte se, že se část, která má být sloučena, vejde do paměti, jinak bude dotaz probíhat mnohem pomaleji. Vytváří se
TABLE1
dvakrát méně zkrátilo můj skutečný čas dotazu z 11 hodin na 40 minut.
Jak Mark zmínil, můžete použít UPDATE
syntaxi a použijte WHERE
klauzule na zúžení části, která má být sloučena - to poskytne stejné výsledky. Vyhněte se také indexování TABLE1
protože to způsobí další práci na přestavbě indexu během MERGE