2012-10-26 4 views
0

espérons que tout va bien. J'ai un problème dans la requête du serveur sql.mise à jour en utilisant le curseur

Je souhaite mettre à jour un enregistrement dans un tableau comportant 534 000 lignes. si je crée une boucle while pour mettre à jour tous les enregistrements, cela prend du temps.

alors je devrais créer un curseur pour l'enregistrement de mise à jour. Après cela, je crée un curseur pour la mise à jour en utilisant Fetch. ce curseur complète le processus de mise à jour rapidement dans 10.000 lignes mais quand j'utilise la table qui a plus de 30.000 lignes cela prend 5 minutes pour exécuter la requête. Je ne sais pas quel est le problème.

son mon code

DECLARE @RNo INT --Declaring the Variable @id 
DECLARE @id INT --Declaring the Variable @id 
set @RNo=1 

DECLARE @MyCursor CURSOR -- Declaring the Cursor 
SET @MyCursor = CURSOR --Assigning the cursor 
FOR 
SELECT Col1 FROM MyTable --Query related to Cursor 
for update of Col2 

OPEN @MyCursor -- Opening the Created cursor 
FETCH NEXT FROM @MyCursor --Retrieving the record one by one 
INTO @id --Assigning the value in declared Variable 
    WHILE @@FETCH_STATUS = 0 
    BEGIN 

     update MyTable 
     set [email protected] 
     where current of @MyCursor 

     set @[email protected]+1 
     print @id 
FETCH NEXT 
    FROM @MyCursor INTO @id 
END 
CLOSE @MyCursor -- Closing the Cursor 
DEALLOCATE @MyCursor -- Deallocating the Cursor Memory 

Note: Ma Recherche exécuter avec des données correctes mais le problème est qu'il faut 5 minuts je veux seulement exécuter cette requête dans les 10 secondes.

Merci à l'avance

+2

** GET RID du curseur! ** C'est votre problème .... ** RBAR ** traitement - ** row-by-agonizing-row **. Fine en C#, horriblement mauvaise en SQL ..... Ce n'est pas du tout nécessaire, et c'est juste un ralentissement inutile ... juste une seule instruction 'UPDATE' fonctionnerait, je crois ... –

Répondre

3

Un expert SQL Server m'a dit une fois, si vous avez besoin d'utiliser les curseurs, assurez-vous que vous utilisez toujours un curseur STATIC LOCAL. Cela mis à part, cette requête mettra à jour vos données en une seule fois.

;WITH TMP AS (
    SELECT *, ROW_NUMBER() OVER (ORDER BY Col1) RN 
    FROM MyTable 
) 
UPDATE TMP SET Col2 = RN; 

J'ai choisi arbitrairement pour produire la numérotation de ligne basé sur ORDER BY Col1, que vous pouvez modifier. Votre curseur n'avait pas de clause ORDER BY donc il aurait été pseudo-aléatoire de toute façon.

+0

+1, mais Je pense qu'il veut mettre Col2 si –

+0

@MrMoose Merci pour la correction! – RichardTheKiwi

+0

oui vous avez raison mais je ne veux pas utiliser row_number. @ RNo + 1 est juste un exemple. Ma question est simple: "Si nous mettons à jour des millions d'enregistrements avec un curseur, alors comment est-il possible de mettre à jour des données en une fois? possible rapidement. " J'espère que vous comprenez merci –

Questions connexes