Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

UPDATE ou MERGE de tabelas muito grandes no SQL Server


Na verdade, descobri recomendações gerais para essas consultas:A ideia de usar o SQL Merge ou Update é muito inteligente, mas falha quando precisamos atualizar muitos registros (ou seja, 75M ) em uma tabela grande e ampla (ou seja, 240 milhões ).

Observando o plano de consulta da consulta abaixo, podemos dizer que TABLE SCAN da TABELA1 e MERGE final estão tomando 90% do 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

Então, para usar MERGE, precisamos:
  1. Reduza o número de linhas que precisamos atualizar e passe essas informações corretamente para o SQL Server. Isso pode ser feito fazendo UTABLE menor ou especificando condition adicional que restringe a parte a ser mesclada.
  2. Certifique-se de que a parte a ser mesclada cabe na memória, caso contrário, a consulta será executada muito mais lentamente. Fazendo TABLE1 duas vezes menos reduziu meu tempo real de consulta de 11 horas para 40 minutos.

Como Mark mencionou, você pode usar UPDATE sintaxe e use WHERE cláusula para restringir a parte a ser mesclada - isso dará os mesmos resultados. Evite também indexar TABLE1 pois isso causará trabalho adicional para reconstruir o índice durante MERGE