2010-01-02 4 views
1

У меня есть таблица «OFICIAL3» с 500k строк. и 30 столбцов. и таблица INSIS с 150 тыс. строк и 20 столбцов. OFICIAL3.NUMERO_TITULO имеет индекс. INSIS.NumeroDocumento также имеет индекс. предложение об обновлении занимает много времени. этот процесс займет 9 часов в моей машине моя машина является Core 2 Duo 2.GHZ и 2 Гб RAMпроблема с производительностью SQL Server 2005 update предложение

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

Вам действительно нужно найти подход, который не включает курсор. Вероятно, это проблема. – DOK

ответ

3

Предполагая OFICIAL4 опечатка, это должно работать как единое обновление:

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 

Как прокомментировали другие, подход, который позволяет избежать КУРСОРА, является весьма предпочтительным с точки зрения производительности. Другая мысль заключается в том, что индекс покрытия на `INSIS (NumeroDocumento, PROYECTO, I_AREA_INTERVENCION) ускорит работу по этому запросу.

+0

Спасибо, я начинаю запускать команду sql ....... – David

+0

Сколько времени ждать? – David

+0

Ну, это заняло 9 часов. 9 минут было бы довольно впечатляюще ... –

0

Есть ли способ, которым вы можете сделать это без курсора? Удаление итерации должно значительно помочь.

+0

Да, есть - см. Мой ответ за минуту до твоего ...;) –

Смежные вопросы