SQL 中的性能差异

Difference in performance in SQL

我在 SQL 服务器 table 上有一个名为 dd 的日期列。

dd
---------------------------
10-01-2015 00:00:00.000
22-05-2015 10:22:32.521
27-05-2015 12:30:48.310
24-12-2014 09:51:11.728
27-05-2015 02:05:40.775
....

我需要检索过去 24 小时内 dd 值的所有行。

我找到了 3 个过滤选项来获得所需的结果:

1. `dd >= getdate() - 1`
2. `dd >= dateadd(day, -1, getdate())
3. `dateadd(day, 1, dd) >= getdate()

我的问题是: 所有 3 个选项都将检索我需要的所有行吗?
如果有,它们之间有什么区别?

  1. dd >= getdate() - 1

这有点像 hack,但它确实有效,但有时会导致错误(http://www.devx.com/dbzone/Article/34594/0/page/2)。

  1. dd >= dateadd(day, -1, getdate())

这是标准的做事方式。

  1. dateadd(day, 1, dd) >= getdate()

这也行,但有一个 NO。如果在该列上创建了任何索引,它将不会使用索引。因为它不是 Search Argument(What makes a SQL statement sargable?)。当您将表达式应用于某些列时,它变为非 SARG 并且不会使用任何索引。

所有 3 个版本都会产生相同的结果,但首先是 hack,在某些情况下会导致错误。三是不会使用索引。所以很明显应该坚持选项 2。

前两个和Giorgi说的完全一样,但是第三个你的Index Seek会变成Index Scan。 SQL 服务器仍将使用该索引,但它不再能够跳转到特定记录,而是必须扫描它以找到它需要的内容。

出于演示的目的,我选择了 table 索引了 DATETIME 列并且只选择了该列以避免任何键查找,并保持计划简单。

另请查看 table 上的读取以及估计的行数与返回的行数。一旦将列包装在函数中,它就无法估计正确的行数,这将在查询变得更复杂时导致较大的性能问题。