Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 性能问题sql server 2005更新语句_Sql Server - Fatal编程技术网

Sql server 性能问题sql server 2005更新语句

Sql server 性能问题sql server 2005更新语句,sql-server,Sql Server,我有一张500行的“OFICIAL3”桌子。和30列。表INSIS有150k行和20列。 当然,数字有一个索引。 INSIS.NumeroDocumento也有一个索引。 更新句子需要很长时间。这个过程在我的机器上需要9个小时 我的机器是一个核心2双核2.GHZ和2GB RAM ALTER PROCEDURE [dbo].[CompletarDatos] AS declare @cantidad int; declare @CONTADOR int; declare @NRO_TITULO VA

我有一张500行的“OFICIAL3”桌子。和30列。表INSIS有150k行和20列。 当然,数字有一个索引。 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

假设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\u AREA\u interfercion)上的覆盖索引将进一步加快此查询的速度。

有没有任何方法可以不用光标完成此操作?删除迭代应该会有很大帮助。

您确实需要找到一种不涉及光标的方法。这可能就是问题所在。是的,在你的答案之前一分钟,请看我的答案……;)我应该等多长时间?我补充了第二个更次要的建议。但是避免光标应该会有很大的不同。谢谢,我也会给这些字段添加索引。有没有办法知道还剩多少时间?我的意思是在三个字段上按那个顺序建立一个索引,以防不清楚。如果不像你所做的那样草草写下信息,就无法知道还有多少时间,这会让事情变得缓慢。最后花了多长时间?