Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

UPDATE o MERGE di tabelle molto grandi in SQL Server

In realtà ho trovato consigli generali per tali query:l'idea di utilizzare SQL Merge o Update è molto intelligente ma fallisce quando dobbiamo aggiornare molti record (ad esempio 75M ) in un tavolo grande e ampio (ad esempio 240M ).

Osservando il piano di query della query sottostante possiamo dire che TABLE SCAN della TABELLA1 e MERGE finale impiegano il 90% del tempo.

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

Quindi per usare MERGE dobbiamo:

  1. Ridurre il numero di righe necessarie per aggiornare e passare correttamente queste informazioni a SQL Server. Questo può essere fatto rendendo UTABLE più piccolo o specificando una condition aggiuntiva che restringe la parte da fondere.
  2. Assicurati che la parte da unire rientri nella memoria, altrimenti la query viene eseguita molto più lentamente. Realizzare TABLE1 due volte in meno ha ridotto il mio tempo reale di interrogazione da 11 ore a 40 minuti.

Come menzionato da Mark puoi usare UPDATE sintassi e usa WHERE clausola per restringere la parte da fondere - questo darà gli stessi risultati. Inoltre, evita di indicizzare TABLE1 poiché ciò causerà ulteriore lavoro per ricostruire l'indice durante MERGE