Jag har faktiskt fått reda på allmänna rekommendationer för en sådan fråga:Idén att använda SQL Merge eller Update är väldigt smart men den misslyckas när vi behöver uppdatera många poster (dvs 75M ) i ett stort och brett bord (dvs 240M ).
Om vi tittar på frågeplanen för frågan nedan kan vi säga att TABLE SCAN
av TABELL1 och slutlig MERGE
tar 90 % av tiden.
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
Så för att kunna använda MERGE måste vi:
- Minska antalet rader vi behöver för att uppdatera och skicka denna information korrekt till SQL Server. Detta kan göras genom att göra
UTABLE
mindre eller anger ytterligarecondition
som begränsar den del som ska slås samman. - Se till att den del som ska slås samman passar i minnet annars går frågan mycket långsammare. Gör
TABLE1
två gånger mindre minskade min verkliga frågetid från 11 timmar till 40 minuter.
Som Mark nämnde kan du använda UPDATE
syntax och använd WHERE
klausul till smal del som ska slås samman - detta ger samma resultat. Undvik också att indexera TABLE1
eftersom detta kommer att orsaka ytterligare arbete med att bygga om index under MERGE