关于可保存性的问题


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() 

我对此发表了回复,说datetime操作应该在变量上(在本例中为GETDATE()),因此实际上该语句应反映如下内容:

SELECT *
FROM table t
WHERE t.column >= DATEADD(min, -1, GETDATE())

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

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

我的问题:

我在推理中错过了什么吗?我对么?最后,是否有任何机构在有关SARGability方面有任何好的文章?

Answers:


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

有点谷歌搜索出现了这样的问题和关于SARGability的有趣的文章


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.