SQL Server - «ложный» оператор IF пропущен, но все еще занимает обычное время? - PullRequest
2 голосов
/ 30 октября 2019

Упрощенный пример моей ситуации: у меня есть такой скрипт:

DECLARE @var1 int = 1
DECLARE @var2 int = 2

IF (@var1 = 1)
   BEGIN
      -- Small SELECT statement that uses @var2
      -- Usually takes less than a second to complete
   END
ELSE
   BEGIN
      -- Large SELECT statement that uses @var2
      -- Usually takes roughly 8 seconds to complete
   END

Проблема, с которой я сталкиваюсь:

Если @var1 = 1, и@var2 = (что угодно), скрипт выполняется менее чем за секунду, как и ожидалось.

Но если я изменю значение @var2, сохраняя @var1 = 1, время выполнения внезапно скачет до 8секунд, даже если предложение ELSE не введено.

Например, вот результаты, если я последовательно сделаю следующее:

1) @var1 = 1, @var2 = 2 -- Less than a second
2) @var1 = 1, @var2 = 3 -- 8 seconds even though ELSE clause isn't entered?
3) @var1 = 1, @var2 = 3 -- Less than a second

Почти кажется, что SELECT оператор в предложении ELSE подвергается переоценке, даже если на самом деле он ничего не возвращает. Является ли это ожидаемым поведением в SQL Server?

(обратите внимание, что, если я полностью закомментирую предложение ELSE, сценарий всегда завершится менее чем за секунду.)

Я попытался устранить неполадкитакая проблема:

DECLARE @var1 int = 1
DECLARE @var2 int = 2

DECLARE @time1 datetime = GETDATE()

IF (@var1 = 1)
   BEGIN
      -- Small SELECT statement that uses @var2
      -- Usually takes less than a second to complete
   END

DECLARE @time2 datetime = GETDATE()

IF (@var1 <> 1)
   BEGIN
      -- Large SELECT statement that uses @var2
      -- Usually takes roughly 8 seconds to complete
   END

DECLARE @time3 datetime = GETDATE()

SELECT @time1 [Time 1], @time2 [Time 2], @time3 [Time 3]

Как и ожидалось, @time2 равняется @time3, потому что предложение ELSE никогда не вводится, но время выполнения скрипта все еще составляет 8 секунд? Почему?

Смотрите скриншот с результатами ниже.

enter image description here

...