Всъщност открих общи препоръки за такива заявки:Идеята за използване на 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