Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

UPDATE ou MERGE de très grandes tables dans SQL Server

En fait, j'ai trouvé des recommandations générales pour de telles requêtes :l'idée d'utiliser la fusion ou la mise à jour SQL est très intelligente, mais elle échoue lorsque nous devons mettre à jour de nombreux enregistrements (c'est-à-dire 75 M ) dans une table grande et large (c'est-à-dire 240M ).

En regardant le plan de requête de la requête ci-dessous, nous pouvons dire que TABLE SCAN de TABLE1 et MERGE final prennent 90 % du temps.

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

Donc, pour utiliser MERGE, nous devons :

  1. Réduisez le nombre de lignes à mettre à jour et transmettez correctement ces informations à SQL Server. Cela peut être fait en rendant UTABLE plus petit ou en spécifiant une condition supplémentaire qui rétrécit la partie à fusionner.
  2. Assurez-vous que la partie à fusionner tient dans la mémoire, sinon la requête s'exécute beaucoup plus lentement. Créer TABLE1 deux fois moins réduit mon temps de requête réel de 11 heures à 40 minutes.

Comme Mark l'a mentionné, vous pouvez utiliser UPDATE syntaxe et utilisez WHERE clause pour restreindre la partie à fusionner - cela donnera les mêmes résultats. Veuillez également éviter d'indexer TABLE1 car cela entraînera un travail supplémentaire pour reconstruire l'index pendant MERGE