Первое, что я хотел бы сказать, это то, что я не совсем этого пытаюсь достичь. Я ОЧЕНЬ упустил этот запрос, чтобы яснее сформулировать свой вопрос.
У меня есть некластеризованный индекс таблицы (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 секунду.
Есть ли причина, по которой при использовании переменной вместо жесткого кодирования значения в место это занимает намного больше времени? Я полностью озадачен этим, и любая помощь будет очень признательна.
Спасибо!
Кристофер Хоуз