Во-первых, вы должны прочитать эту статью об использовании TOP
без ORDER BY
.Короткая версия: вы не можете гарантировать, что результаты будут одинаковыми при каждом запуске, если у вас нет ORDER BY
.
Первый запрос выполняется быстро, потому что SQL Server просто выполняет TABLE SCAN для * 1008.* первые 100 строк.Легко.Теперь вы добавляете предложение WHERE
... SQL Server должен найти все строки, в которых этот предикат имеет значение true.Конечно, у вас есть индекс, это может помочь.SQL Server будет (или может) использовать этот индекс, но если он это сделает, ему придется выполнить поиск ключей, чтобы получить остальные столбцы (поскольку вы SELECT *
).Таким образом, он должен сделать намного больше работы.Весьма вероятно, что индекс даже не используется, поскольку SQL Server может решить, что быстрее просто выполнить TABLE SCAN, чтобы проверить этот предикат в каждой строке, вместо поиска ключа.Это, конечно, означает, что вам нужно прочитать 40 миллионов строк (проверьте, насколько велика ваша таблица ... это должно войти в память. Бьюсь об заклад, она выгружается на диск, может быть, даже разлив в TEMPDB ).
Итак, конечно, это будет медленнее ... вы проверяете условие по 40 миллионам строк вместо того, чтобы вытягивать random TOP 100
.Если вам нужна дополнительная помощь, нам нужны планы выполнения как минимум со всеми операторами DDL (создать таблицу, создать индекс).
Другие варианты для исследования: