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 :
- 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 unecondition
supplémentaire qui rétrécit la partie à fusionner. - 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