Помогите с оптимизацией цикла SQL While

0

Мне нужна помощь, пожалуйста, оптимизируя 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 
  • 0
    Сколько предметов вы обрабатываете? Вы уверены, что нет никаких блоков во время обработки? Можно ли ввести sp-код в запрос выше, чтобы мы могли видеть, есть ли способ сделать эту операцию на основе набора?
Теги:
tsql
sql-server-2005

2 ответа

2
Лучший ответ

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

Добавление: стоит попробовать и сделать это без использования курсора и прокрутки.

  • 0
    согласился - проверь SP - я собирался напечатать это, а ты опередил меня.
  • 0
    Перед этим циклом я использую CTES для фильтрации данных до того момента, когда мне нужно будет выполнить вставки в две таблицы для каждой строки, если условие выполнено. Если вы посмотрите, я вызываю два внешних хранимых процесса в LOP там. Как мне добиться этого без петли?
Показать ещё 2 комментария
0

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

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

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

  • 0
    В SQL Server нет конструкции цикла. Кроме того, корень проблемы в том, что здесь вообще есть петля.
  • 0
    «В SQL Server нет конструкции цикла for» - ну, есть цикл WHILE, но вы правы, говоря «избегайте циклов». Основанный на множестве подход лучше
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню