Właściwie znalazłem ogólne zalecenia dla takich zapytań:Pomysł na użycie SQL Merge lub Update jest bardzo sprytny, ale nie udaje się, gdy potrzebujemy zaktualizować wiele rekordów (np. 75M ) w dużym i szerokim stole (tj. 240M ).
Patrząc na plan zapytania poniżej, możemy powiedzieć, że TABLE SCAN
TABLE1 i końcowe MERGE
zajmują 90% czasu.
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
Aby więc użyć MERGE, musimy:
- Zmniejsz liczbę wierszy, które musimy zaktualizować i poprawnie przekaż te informacje do SQL Server. Można to zrobić, tworząc
UTABLE
mniejszy lub określając dodatkowycondition
która zawęża część, która ma zostać scalona. - Upewnij się, że część, która ma zostać scalona, mieści się w pamięci, w przeciwnym razie zapytanie działa znacznie wolniej. Tworzenie
TABLE1
dwa razy mniej skróciło mój rzeczywisty czas zapytania z 11 godzin do 40 minut.
Jak wspomniał Mark, możesz użyć UPDATE
składnia i użyj WHERE
klauzula o zawężeniu części, która ma zostać scalona - da to takie same wyniki. Unikaj również indeksowania TABLE1
ponieważ spowoduje to dodatkową pracę przy przebudowie indeksu podczas MERGE