Мне просто нужно подтвердить, что я правильно что-то понимаю:
Недавно я просмотрел вопрос SO, в котором пользователь опубликовал ответ в Linq, например:
from p in db.table where p.column.AddMinutes(1) > DateTime.Now select p
Для тех, кто не знаком с Linq, я ожидаю, что результат этого утверждения (не проверенный честно) будет:
SELECT *
FROM table t
WHERE DATEADD(min, 1, t.column) >= GETDATE()
Я опубликовал ответ на это, сказав, что манипуляции с датой и временем должны быть в переменной (в данном случае GETDATE()
), поэтому на самом деле оператор должен отражать что-то вроде:
SELECT *
FROM table t
WHERE t.column >= DATEADD(min, -1, GETDATE())
В моем ответе биты, в которых я сейчас не уверен, предполагают следующее:
- Индексы не будут использоваться из-за манипулирования столбцом
- Планы запросов будут отличаться отчасти из-за вышеизложенного (не проверено, если так)
- Из-за вышеизложенного 1-й запрос будет работать хуже, чем 2-й.
Мой вопрос:
Я что-то упустил в своих рассуждениях? Я прав? Наконец, есть ли у кого-нибудь хорошие статьи о SARGability?