关于 SARGability 的问题

Stu*_*ler 11 performance linq

我只需要确认我理解正确:

我最近查看了一个 SO 问题,其中用户在 Linq 中发布了一个答案,例如:

from p in db.table where p.column.AddMinutes(1) > DateTime.Now select p
Run Code Online (Sandbox Code Playgroud)

对于那些不熟悉 Linq 的人,我希望该语句的输出(未经公平测试)是:

SELECT *
FROM table t
WHERE DATEADD(min, 1, t.column) >= GETDATE() 
Run Code Online (Sandbox Code Playgroud)

我对此发表了回复,说日期时间操作应该在变量上(在这种情况下GETDATE()),因此实际上该语句应该反映如下内容:

SELECT *
FROM table t
WHERE t.column >= DATEADD(min, -1, GETDATE())
Run Code Online (Sandbox Code Playgroud)

在我的回复中,我现在不确定的部分,假设如下:

  1. 由于对列的操作,将不会使用索引
  2. 由于上述原因,查询计划将有所不同(未经测试,假设如此)
  3. 由于上述原因,第一个查询实际上会比第二个查询表现更差。

我的问题:

我在推理中遗漏了什么吗?我对么?最后,有没有机构有关于 SARGability 的好文章?

Jac*_*las 6

  1. 正确的
  2. 不一定——这取决于是否存在合适的指数以及 CBO 是否决定使用它。例如,如果表很小或统计信息导致优化器相信过滤器对于大部分结果都是正确的,它可能会认为 FTS 的成本较低
  3. 这不能保证 - 甚至第二个查询的性能可能会更差 - 但您的推理从根本上是合理的。例如,在 FTS 实际上更快的边缘情况下,CBO 可能会根据其对成本的最佳猜测来选择索引扫描 - 当然这始终只是估计

一些谷歌搜索出现了这个 SO 问题这篇关于 SARGability 的有趣文章


Mar*_*ian 5

杰克是对的,所以我不会重复。

我将添加一些我喜欢的关于表达式的可替换性的文章:

他们都是拥有丰富 SQL Server 经验的伟大作家。