2014-01-07 2 views
6
SET STATISTICS TIME OFF; 

DECLARE @String AS VARCHAR(10), @I INT = 1  

WHILE @I <= 3 
BEGIN 
SET @String = CASE @I WHEN 1 THEN 'First' WHEN 2 THEN 'Second' WHEN 3 THEN 'Third' END; 

    SELECT @String AS [StatsTimeOff] OPTION(RECOMPILE) 

    SET STATISTICS TIME ON 

    SELECT @String AS [StatsTimeOn] OPTION(RECOMPILE) 

    SET STATISTICS TIME OFF 

SET @I +=1; 
END 

ВозвращаетСтранный побочный эффект «НАСТРОЙКА СТАТИСТИКИ СТАТИСТИКИ» в SQL Server 2008R2?

StatsTimeOff 
------------ 
First 

StatsTimeOn 
----------- 
First 


StatsTimeOff 
------------ 
Second 

StatsTimeOn 
----------- 
First 


StatsTimeOff 
------------ 
Third 

StatsTimeOn 
----------- 
First 

Почему комбинация OPTION(RECOMPILE) и SET STATISTICS TIME ON по-видимому, сделать переменный регресс к своему первоначальному значению?

Я никогда не видел SET STATISTICS TIME ON, оказывая влияние на результат раньше.
Я что-то пропустил, здесь?

+0

Как это связано? Когда @pDateFrom «2013-01-01» и SET STATISTICS TIME ON есть, он приводит к набору NULL вместо набора «2013-01-01». – Serge

+0

Я только что проверил, добавляет ли предложение ORDER BY что-то, но это не так. – Serge

+0

@MartinSmith Здесь вы – Serge

ответ

1

Это похоже на ошибку, и я могу воспроизвести ее в SQL Server 2008 R2 SP2. Я считаю, что ваше дело заявление занимает путь от него немного, как вы можете воспроизвести проблему, просто выбрав @i, где я хотел бы переписать его следующим образом:

DECLARE @I INT = 1 

WHILE @I <= 3 
BEGIN 
    SELECT FirstRun = @I OPTION(RECOMPILE) 

    SET STATISTICS TIME ON 

    SELECT SecondRun = @I OPTION(RECOMPILE) 

    SELECT ThirdRun = @I OPTION(RECOMPILE) 

    SET @I +=1 
END 

Так как я считаю, что это ошибка, я не собираюсь пытаться его исправить. Однако я бы предложил переместить все настройки SSMS в начало вашей партии и запустить все это. Эта обходная работа позволила бы избежать этой проблемы.

Мое предположение заключается в том, что при замене опции он возвращается через весь запрос, чтобы попытаться выяснить, как выполнить план выполнения, и когда он делает это, он захватывает (неправильно) начальное значение переменной. Поскольку он использует OPTION (RECOMPILE), этот параметр помещается в план как константа, поэтому вы видите эту ошибку только при использовании этой опции.

Очень странно, что если вы запустите этот оператор выбора сразу же после этого, он начнет возвращать правильное значение. Это то, чего я не ожидал, и дает вам еще одно рабочее задание, позволяющее вам включать статистику и запускать что-то еще после нее, например, как это ни странно, SET STATISTICS IO ON.

Смежные вопросы