Питання про 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.