Команда SQL, содержащая TOP 1, имеет бесконечное время загрузки

#sql #sql-server #command #load

Вопрос:

У меня была команда SQL, которая работала без каких-либо проблем. Однако сегодня команда, казалось, перестала работать. Он просто загружается без завершения.

 DECLARE @varVKA VARCHAR(20) 
SELECT TOP 1 @varVKA = t.AufNr 
FROM TABLE AS t 
WHERE RStatus = '10' 
Order By AufNr asc 

UPDATE TABLE
SET RStatus = '30' WHERE AufNr = @varVKA
 

Я немного поработал над устранением неполадок, и единственное, что я заметил, — это то, что, когда я меняю ВЕРХНЮЮ часть на любую другую сумму, результаты почти мгновенны.

Что могло измениться, чтобы ТОП-1 не работал? Команда работает без проблем уже более года.

Комментарии:

1. Почему вы используете два оператора и переменную, когда для этого можно использовать один update ? Также пометьте базу данных, которую вы используете.

2. @GordonLinoff Я написал это как два заявления и обновление, потому что я не знал, как поместить все это в одно заявление об обновлении. Поскольку с запуском не было никаких проблем, я оставил его настолько простым и понятным для меня, насколько мог, вместо того, чтобы копировать и вставлять одно большое обновление, которое я не понял. Я полностью за обучение, поэтому я обязательно рассмотрю возможность оптимизации команды. С обновленным тегом все в порядке?

Ответ №1:

Если вы хотите обновить только одну строку, вы можете сделать:

 UPDATE t
    SET RStatus = '30'
    FROM (SELECT TOP 1 t.* 
          FROM TABLE t 
          WHERE RStatus = '10' 
          ORDER BY AufNr ASC
         ) t;
 

Комментарии:

1. Огромное спасибо за эту помощь

2. Спасибо за ответ! Мне это было нужно для каждой позиции с конкретным AufNr. Тем не менее, мы очень ценим вашу помощь и предложения.

Ответ №2:

Немного поэкспериментировав, я думаю, что нашел решение. Я все еще не уверен, почему ошибка произошла без сбоев в течение как минимум года, но, возможно, это как-то связано с «TOP 1 AufNr» и «ЗАКАЗ ПО AufNr asc».

Как только я заменил «ЗАКАЗАТЬ ПО» на «минимум», что, похоже, работает аналогично, команда снова работает.

Я также изучил то, что предложил @GordonLinoff, и, надеюсь, улучшил команду.

Теперь команда выглядит так:

 UPDATE TableName
SET Rstatus = '30' 
WHERE AufNr =(

SELECT  min(AufNr) 
FROM TableName 
WHERE RStatus = '10')