J'ai deux tables, dans deux bases de données différentes. J'utilise l'une des tables pour mettre à jour les valeurs dans l'autre table de base de données.Comment puis-je améliorer cette requête en termes de performances, fournir un statut et exécuter en tant que travail SQL?
Il existe plus de 200 000 lignes à parcourir et l'exécution d'une instance Amazon c3.xlarge prend plusieurs heures.
est inférieure à la requête que je suis en cours d'exécution, et je me demande trois choses:
- cette requête peut être optimisé pour fonctionner plus rapidement?
- Je voudrais ajouter un compte pour obtenir le nombre d'enregistrements réels mis à jour.Comment?
- Comment puis-je transformer cela en travail SQL?
DECLARE @id VARCHAR(12) -- unique id DECLARE @currentval VARCHAR(64) -- current value DECLARE @newval VARCHAR(64) -- updated value DECLARE db_cursor1 CURSOR FOR SELECT b.[id], a.status, b.[New Status] FROM db1.dbo.['account'] as b inner join db2.dbo.accounttemp as a on a.ACCOUNTID = b.[ID] OPEN db_cursor1 FETCH NEXT FROM db_cursor1 INTO @id, @currentval, @newval WHILE @@FETCH_STATUS = 0 BEGIN UPDATE db2.dbo.accounttemp SET status = @newval WHERE ACCOUNTID = @id AND STATUS = @currentval FETCH NEXT FROM db_cursor1 INTO @id, @currentval, @newval END CLOSE db_cursor1 DEALLOCATE db_cursor1
Curseurs sont lents, ce est facile à mettre à jour avec 'UPDATE aliasName FROM ...', je vous suggère d'essayer de faire ce remplacement, et de vérifier vos performances par la suite pour voir si elle est satisfaisante. – scragar
Y at-il une raison spécifique pour laquelle vous utilisez un curseur ici. Cela semble assez simple à faire avec un seul UPDATE basé sur l'ensemble ... –
Probablement vous pouvez utiliser des expressions de table communes Jetez un oeil à ceci: http: //stackoverflow.com/questions/11562536/update-records-in- table-from-cte –