En realidad, encontré recomendaciones generales para este tipo de consultas:la idea de usar SQL Merge o Update es muy inteligente, pero falla cuando necesitamos actualizar muchos registros (es decir, 75M ) en una mesa grande y ancha (es decir, 240M ).
Mirando el plan de consulta de la consulta a continuación, podemos decir que TABLE SCAN
de TABLE1 y MERGE
final están tomando el 90% del tiempo.
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
Entonces, para usar MERGE, necesitamos:
- Reduzca la cantidad de filas que necesitamos actualizar y pase correctamente esta información a SQL Server. Esto se puede hacer haciendo
UTABLE
más pequeño o especificandocondition
adicional que estrecha la parte que se fusionará. - Asegúrese de que la parte que se fusionará quepa en la memoria; de lo contrario, la consulta se ejecutará mucho más lentamente. Haciendo
TABLE1
dos veces menos reduje mi tiempo de consulta real de 11 horas a 40 minutos.
Como Mark mencionó, puedes usar UPDATE
sintaxis y use WHERE
cláusula para estrechar la parte que se fusionará:esto dará los mismos resultados. Además, evite indexar TABLE1
ya que esto causará trabajo adicional para reconstruir el índice durante MERGE