Упрощенный пример моей ситуации: у меня есть такой скрипт:
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 секунд? Почему?
Смотрите скриншот с результатами ниже.