Вопрос по SARGability


11

Мне просто нужно подтвердить, что я правильно что-то понимаю:

Недавно я просмотрел вопрос 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. Планы запросов будут отличаться отчасти из-за вышеизложенного (не проверено, если так)
  3. Из-за вышеизложенного 1-й запрос будет работать хуже, чем 2-й.

Мой вопрос:

Я что-то упустил в своих рассуждениях? Я прав? Наконец, есть ли у кого-нибудь хорошие статьи о SARGability?

Ответы:


6
  1. верный
  2. не обязательно - это зависит от того, существует ли подходящий индекс и решает ли он использовать его. Например, если таблица мала или статистика приводит оптимизатора к убеждению, что фильтр будет верным для большого процента результатов, он может считать, что стоимость FTS ниже
  3. это не гарантировано - даже возможно, что второй запрос будет работать хуже - но ваши рассуждения в основном обоснованы. Например, в крайнем случае, когда FTS будет на самом деле быстрее, CBO может вместо этого выбрать сканирование индекса, основываясь на своем лучшем предположении о стоимости - что всегда является лишь оценкой курса

Немного погуглил этот вопрос и эту интересную статью о SARGability.


5

Джек прав, поэтому я не буду повторять это.

Я просто добавлю несколько статей, которые мне нравятся в отношении проходимости выражения:

Все они замечательные писатели с большим опытом работы с SQL Server.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.