Помогите с оптимизацией цикла SQL While - PullRequest
0 голосов
/ 23 ноября 2010

Мне нужна помощь, пожалуйста, оптимизируйте цикл SQL While Loop ниже. Это призывает тех, кто испытал это, пожалуйста, помогите. В настоящее время мой код 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 ]

2 голосов
/ 23 ноября 2010

Я не думаю, что оптимизация должна занять место в вашем цикле. Я рекомендую проверить, что происходит в хранимых процедурах. Первый ответ был правильным, сказав, что вы должны переместить ваши объявления вне цикла. Но я не верю, что это сэкономит значительное количество времени.

Приложение: стоит попробовать и сделать это с помощью курсора и обхода.

0 голосов
/ 23 ноября 2010

не зная t-sql, я сразу вижу 2 вещи.

  • Зачем использовать while для подсчитанного цикла?Используйте цикл for (в plsql у нас есть циклы курсора специально для итерации курсора)

  • Почему вы объявляете / инициализируете свои переменные внутри цикла?Может быть, есть метод Declare их снаружи и их повторная инициализация (при необходимости) внутри цикла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...