性能问题sql server 2005更新句子

时间:2010-01-02 22:18:13

标签: sql-server

我有一个表“OFICIAL3”,有500k行。和30列。和表格INSIS有150k行和20列。 OFICIAL3.NUMERO_TITULO有一个索引。 INSIS.NumeroDocumento也有一个索引。 更新句子需要很长时间。这个过程需要9个小时才能完成 我的机器是核心2双核2.GHZ和2GB RAM

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 @CONTADOR=@CONTADOR+1
        PRINT 'ROW='+CONVERT(NVARCHAR(30),@CONTADOR)+' NRO TITULO='+@NRO_TITULO

        SET @I_PROYECTO = (SELECT  PROYECTO FROM INSIS WHERE NumeroDocumento=@NRO_TITULO)
        SET @I_AREA_INT = (SELECT  I_AREA_INTERVENCION FROM INSIS WHERE NumeroDocumento=@NRO_TITULO)             

        UPDATE OFICIAL3 SET PROYECT=@I_PROYECTO , COD_AREA=@I_AREA_INT WHERE NUMERO_TITULO=@NRO_TITULO      

        fetch next from CURSORITO   into @NRO_TITULO

end   

 -- cerramos el cursor
  close CURSORITO
  deallocate CURSORITO

END

2 个答案:

答案 0 :(得分: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

正如其他人所评论的那样,从性能的角度来看,避免使用CURSOR的方法是非常可取的。另一个想法是`INSIS(NumeroDocumento,PROYECTO,I_AREA_INTERVENCION)上的覆盖索引会加快这个查询的速度。

答案 1 :(得分:0)

如果没有光标,有没有办法可以做到这一点?删除迭代应该有很大帮助。