Faktisk har jeg fundet ud af generelle anbefalinger til sådan en forespørgsel:Idéen til at bruge SQL Merge eller Update er en meget smart idé, men den mislykkes, når vi skal opdatere mange poster (dvs. 75M ) i et stort og bredt bord (dvs. 240M ).
Når vi ser på forespørgselsplanen for forespørgslen nedenfor, kan vi sige, at TABLE SCAN
af TABEL1 og endelig MERGE
tager 90 % af 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å for at bruge MERGE skal vi:
- Reducer antallet af rækker, vi skal opdatere, og videregive disse oplysninger korrekt til SQL Server. Dette kan gøres ved at lave
UTABLE
mindre eller angive yderligerecondition
der indsnævrer den del, der skal fusioneres. - Sørg for, at den del, der skal flettes, passer i hukommelsen, ellers kører forespørgslen meget langsommere. Opretter
TABLE1
to gange mindre reducerede min reelle forespørgselstid fra 11 timer til 40 minutter.
Som Mark nævnte kan du bruge UPDATE
syntaks og brug WHERE
klausul til snæver del, der skal slås sammen - dette vil give samme resultater. Undgå også at indeksere TABLE1
da dette vil medføre yderligere arbejde med at genopbygge indekset under MERGE