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