该存储过程的代码如下,/*-------------------------修改记录-------------------------------
**
**    修改人:
-----------------------------------------------------------------*/CREATE PROCEDURE dbo.ODRECORD_Main_Reserve(
@type                nvarchar(2),
@Loginer  NVARCHAR(6),
@GLIDEID  NVARCHAR(20) --订单号
)
AS
BEGIN
DECLARE @sql NVARCHAR(255)
DECLARE @WSID NVARCHAR(20)
DECLARE @GDID NVARCHAR(20)
DECLARE @GDSUM NVARCHAR(20) SET @sql = 'DELETE FROM ODRECORD_Main WHERE GLIDEID = ''' + @GLIDEID + '''' DECLARE my_cursor CURSOR  FOR SELECT X1.WSID, X2.GDID, X2.GDSUM FROM ODRECORD_Main X1 RIGHT
               JOIN ODRECORD X2 ON X1.GLIDEID = X2.ODID WHERE X1.GLIDEID = @GLIDEID
OPEN my_cursor

FETCH NEXT FROM my_cursor INTO @WSID, @GDID, @GDSUM WHILE @@FETCH_STATUS = 0
BEGIN
EXEC GdStock_Operation @type,@WSID,@GDID,@GDSUM
     FETCH NEXT FROM my_cursor INTO @WSID, @GDID, @GDSUM
END CLOSE my_cursor
deallocate my_cursor

EXEC (@sql)
IF @@error<>0
RETURN 0
else
BEGIN
--EXEC   Add_LOG @Loginer, '03', @SQL, '' 
SET @sql = 'DELETE FROM ODRECORD WHERE ODID = ''' + @GLIDEID + ''''
exec (@sql)
--EXEC   Add_LOG @Loginer, '03', @sql, '' 

IF @@ERROR = 0
RETURN 1
ELSE
RETURN 0
END
ENDGO谢谢!

解决方案 »

  1.   

    游标慢是正常的,最好不要用,加个FAST_FORWARD看看,估计不会快多少
      

  2.   

    正确答案是:DELETE操作要写日志...当删除对象记录数量很多的时候....悲剧发生了
      

  3.   

    我曾经试过单纯用DELETE命令删除千万级的表记录好久好久好久好久,直到我点了取消,都没完....
      

  4.   

    说说可能的解决方法吧把这个存储过程和GdStock_Operation 合并,可能可以取消游标,想法用临时表或者表连接代替,必要时可能会用到自定义函数,能否成功主要看存储过程GdStock_Operation 的内容了基本上,需要存储过程重写。
      

  5.   


    仔细看了下,如果游标是空,那实际执行的只有
    SET @sql = 'DELETE FROM ODRECORD_Main WHERE GLIDEID = ''' + @GLIDEID + ''''
    exec (@sql)

           SET @sql = 'DELETE FROM ODRECORD WHERE ODID = ''' + @GLIDEID + ''''
            exec (@sql)
     
    看看ODRECORD_Main.GLIDEID和ODRECORD.ODID有无索引,没有加上应该能提高速度
      

  6.   

    我建议你先加上些输出系统时间的DEBUG语句看看是while占时间多
    还是删除1占时间多
    还是删除2占时间多
      

  7.   

    --游标里面调用存储过程,把这个存储过程的代码帖出来:GdStock_Operation!--看写的什么东东,能否优化!
      

  8.   

    FETCH NEXT FROM my_cursor INTO @WSID, @GDID, @GDSUM
    在客户又一次出现问题的情况下,我,找到了问题出现的地方,时间几乎都在执行上头的一句,虽说这个游标是无数据集的。