帮助优化SQL While循环

时间:2010-11-23 00:59:35

标签: sql mysql sql-server-2005 tsql

我需要帮助,请在下面优化SQL While循环。这是呼吁那些有经验的人请求帮助。目前,我的T-SQL代码运行超过25分钟,我想尽可能减少这个时间。我能够将此循环识别为一个主要的问题区域,并希望能够帮助您完成此任务。

 DECLARE @rownumber int

 DECLARE @power_show BIT

 DECLARE  @AD_show BIT 

  set @rownumber = 0 

--FOR EACH ROW CONTAINED IN MY TEMPTABLE

 WHILE @rownumber < @rowcounter

 BEGIN
      set @rownumber = @rownumber + 1

       -- THE VARIABLES 
      DECLARE @record_no as BIGINT
      DECLARE @phone_name VARCHAR(30)
      DECLARE @messagepriority as INTEGER
      DECLARE @phone_number VARCHAR(30)
      DECLARE @phone_id BIGINT
      DECLARE @questionMessage BIGINT

      SELECT   
@phone_name = n.phone_name, @phone_number =n.phone_number, @messagepriority =n.messagepriority, @phone_id=n.phone_id , 
      @AD_show=n.AD_show, @power_show=n.power_show
      FROM 
      #temporary_phonetable n WITH(NOLOCK) 
      WHERE n.rownumber = @rownumber

      --EXECUTE STOREDPROC ADDMESSAGETOQUEUE WHICH RETURNS THE ROWID OF THE NEWLY CREATED ROW, IF ANY
      SELECT @record_no = sp_queryExecute AddMessageToQueue(@phone_number, @responsemessages, @dateresponsessent, @savednames, @userid,                                                                    un.messagepriority, @responsetype,  un.AD_show, un.power_show, @service_provider, @PhoneType)  


      If(@questionid > 0)
      BEGIN 
            -- EXECUTE STOREDPROC ADDQUESTIONMESSAGE WHICH RETURNS THE ROWID OF NEWLY CREATED ROW, IF ANY 
            SET @questionMessage = sp_queryExecute  AddQuestionMessage(@questionid,@phone_id,  @record_no, DATEADD(d, 30, GETDATE()) )
      END 

            -- ADD THE NEW ROWID TO THE TEMP TABLE
            UPDATE #temporary_phonetable SET record_no = @record_no, questionMessage=@questionMessage 
            WHERE phone_number = @phone_number  AND rownumber = @rownumber
      END 

2 个答案:

答案 0 :(得分:2)

我认为优化不需要在循环中使用mplace。我建议检查存储过程中发生的情况。 第一个答案是正确的,说你应该把你的声明移到循环之外。但我不相信这会节省大量时间。

附录:尝试使用游标并且不得不循环执行此操作是值得的。

答案 1 :(得分:0)

不知道t-sql我立即看到了两件事。

  • 为什么要使用While计数循环? 使用for循环(在plsql中我们有 游标循环专门用于 迭代游标)

  • 为什么要声明/初始化 你的vars在循环中?也许 有一个声明他们在外面和 重新初始化它们(如果需要) 在循环中。