2014-06-16 4 views
0

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:

  1. cette requête peut être optimisé pour fonctionner plus rapidement?
  2. Je voudrais ajouter un compte pour obtenir le nombre d'enregistrements réels mis à jour.Comment?
  3. 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 
+1

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

+1

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 ... –

+0

Probablement vous pouvez utiliser des expressions de table communes Jetez un oeil à ceci: http: //stackoverflow.com/questions/11562536/update-records-in- table-from-cte –

Répondre

1
  1. En examinant la procédure, vous verrez que vous pouvez supprimer complètement le curseur à l'aide l'instruction SQL suivante

    MISE À JOUR db2.dbo.accounttemp état SET = a .Status FROM db2.dbo.accounttemp at INNER JOIN db1.dbo. ['Compte'] EN ÉTAT a.Id = at. [ACCOUNTID] O a a.Statut = at.Statu s

  2. appel de la ligne suivante pour renvoyer les lignes affectées par la mise à jour

    RETURN @@ROWCOUNT 
    
  3. Vous pouvez créer un plan de maintenance SQL pour exécuter sur base régulière

+0

Merci pour la réponse. Il est évident, par la nature de ma question, que je suis novice en ce qui concerne les curseurs et que j'utilise des instructions SQL plus avancées. J'utilisais un curseur, car je pensais que c'était la seule façon de parcourir chaque enregistrement pour effectuer une mise à jour. Pouvez-vous fournir un exemple complet du code SQL que je dois exécuter et expliquer comment votre SQL parcourt chaque enregistrement? Merci beaucoup! –

+0

@ user1770228 Qu'est-ce qui vous fait dire que vous devez répéter? –

+0

Parce qu'il y a 200 000 enregistrements uniques dans la table source qui contiennent de nouvelles valeurs qui doivent être mises à jour dans la table de destination. Si je ne parcoure pas les enregistrements, comment effectue-t-il une mise à jour pour chaque nouvelle valeur/enregistrement unique? –

Questions connexes