Почему мой оператор SQL выполняется в N раз дольше, когда я устанавливаю значение как переменная?

Первое, что я хотел бы сказать, это то, что я не совсем этого пытаюсь достичь. Я ОЧЕНЬ упустил этот запрос, чтобы яснее сформулировать свой вопрос.

У меня есть некластеризованный индекс таблицы (CallDetail) с двумя значениями: TermDate (int) и SourceSystemID (int). Для полноты я приведу здесь точное определение индекса:

CREATE NONCLUSTERED INDEX [CallDetail_TermDateSourceSystemID] ON [dbo].[CallDetail] 
(
    [TermDate] ASC,
    [SourceSystemID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]

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

Запрос 1 (~ 1 секунда):

SELECT
    *
FROM
    CallDetail
WHERE
    CallDetail.TermDate >= 1101221 AND
    SourceSystemID = 1

Запрос 2 (> 30 минут):

DECLARE @TermDate AS INT
SET @TermDate = 1101221

SELECT
    *
FROM
    CallDetail
WHERE
    CallDetail.TermDate >= @TermDate AND
    SourceSystemID = 1

Я хотел бы отметить в том, что план выполнения запроса говорит мне «включить» все столбцы этой таблицы в индекс. Я считаю, что это совершенно неправильно. Я также хотел бы отметить, что если я выберу только TermDate и SourceSystemID вместо *, я получу результаты примерно через 1 секунду.

Есть ли причина, по которой при использовании переменной вместо жесткого кодирования значения в место это занимает намного больше времени? Я полностью озадачен этим, и любая помощь будет очень признательна.

Спасибо!

Кристофер Хоуз

5
задан Christopher Haws 22 December 2010 в 21:57
поделиться