2010-01-02 4 views
1

J'ai une table "OFICIAL3" avec 500k lignes. et 30 colonnes. et table INSIS avec 150k lignes et 20 colonnes. OFICIAL3.NUMERO_TITULO a un index. INSIS.NumeroDocumento a aussi un index. mettre à jour la phrase prend beaucoup de temps. ce processus prendra 9 heures dans ma machine ma machine est un core 2 duo 2.GHZ et 2 Go de RAMproblème de performance SQL Server 2005 mise à jour phrase

ALTER PROCEDURE [dbo].[CompletarDatos] AS 
declare @cantidad int; 
declare @CONTADOR int; 
declare @NRO_TITULO VARCHAR(600); 
declare @POYECTO VARCHAR(200); 
DECLARE @I_PROYECTO VARCHAR(500); 
DECLARE @I_AREA_INT VARCHAR(500); 

SET NOCOUNT ON 
BEGIN 

SET @cantidad =(select count(*) from OFICIAL3) 
SET @CONTADOR=1 

declare CURSORITO cursor for 
select NUMERO_TITULO from OFICIAL3 
open CURSORITO 


fetch next from CURSORITO 
into @NRO_TITULO 


while @@fetch_status = 0 
begin 

     SET @[email protected]+1 
     PRINT 'ROW='+CONVERT(NVARCHAR(30),@CONTADOR)+' NRO TITULO='[email protected]_TITULO 

     SET @I_PROYECTO = (SELECT PROYECTO FROM INSIS WHERE [email protected]_TITULO) 
     SET @I_AREA_INT = (SELECT I_AREA_INTERVENCION FROM INSIS WHERE [email protected]_TITULO)    

     UPDATE OFICIAL3 SET [email protected]_PROYECTO , [email protected]_AREA_INT WHERE [email protected]_TITULO  

     fetch next from CURSORITO into @NRO_TITULO 

end 

-- cerramos el cursor 
    close CURSORITO 
    deallocate CURSORITO 

END 
+0

Vous avez vraiment besoin de trouver une approche qui n'implique pas de curseur. C'est probablement le problème. – DOK

Répondre

3

Si l'on suppose OFICIAL4 est une faute de frappe, cela devrait fonctionner comme une mise à jour unique:

UPDATE o 
SET  PROYECT = i.PROYECTO, 
     COD_AREA = i.I_AREA_INTERVENCION 
FROM OFICIAL3 o 
     INNER JOIN 
       INSIS i 
       ON o.NUMERO_TITULO = i.NumeroDocumento 

Comme d'autres l'ont remarqué, une approche qui évite le CURSEUR est grandement préférable du point de vue de la performance. Une autre idée est qu'un index de couverture sur `INSIS (NumeroDocumento, PROYECTO, I_AREA_INTERVENCION) accélèrerait les choses pour cette requête.

+0

Merci, je commence à exécuter la commande sql ....... – David

+0

Combien de temps devrais-je attendre? – David

+0

Eh bien, cela prenait 9 heures. 9 minutes aurait été assez impressionnant ... –

0

Est-il possible de faire cela sans un curseur? Supprimer l'itération devrait l'aider considérablement.

+0

Oui il y a - voir ma réponse une minute avant la vôtre ...;) –

Questions connexes