Всъщност открих общи препоръки за такива заявки:Идеята за използване на SQL Merge или Update е много умна, но се проваля, когато трябва да актуализираме много записи (т.е. 75M ) в голяма и широка маса (т.е. 240M ).
Разглеждайки плана на заявката на заявката по-долу можем да кажем, че TABLE SCAN
на ТАБЛИЦА 1 и окончателно MERGE
отнемат 90% от времето.
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
Така че, за да използваме MERGE, трябва да:
- Намалете броя на редовете, които трябва да актуализираме, и правилно предайте тази информация на SQL Server. Това може да стане, като направите
UTABLE
по-малък или посочващ допълнителноcondition
което стеснява частта за сливане. - Уверете се, че частта, която ще се слее, се побира в паметта, в противен случай заявката ще се изпълнява много по-бавно. Създаване на
TABLE1
два пъти по-малко намали реалното ми време за търсене от 11 часа на 40 минути.
Както Марк спомена, можете да използвате UPDATE
синтаксис и използвайте WHERE
клауза за стесняване на частта за обединяване - това ще даде същите резултати. Също така, моля, избягвайте индексирането на TABLE1
тъй като това ще причини допълнителна работа за възстановяване на индекса по време на MERGE