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 个选项都将检索我需要的所有行吗?
如果有,它们之间有什么区别?
dd >= getdate() - 1
这有点像 hack,但它确实有效,但有时会导致错误(http://www.devx.com/dbzone/Article/34594/0/page/2)。
dd >= dateadd(day, -1, getdate())
这是标准的做事方式。
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 上的读取以及估计的行数与返回的行数。一旦将列包装在函数中,它就无法估计正确的行数,这将在查询变得更复杂时导致较大的性能问题。
我在 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 个选项都将检索我需要的所有行吗?
如果有,它们之间有什么区别?
dd >= getdate() - 1
这有点像 hack,但它确实有效,但有时会导致错误(http://www.devx.com/dbzone/Article/34594/0/page/2)。
dd >= dateadd(day, -1, getdate())
这是标准的做事方式。
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 上的读取以及估计的行数与返回的行数。一旦将列包装在函数中,它就无法估计正确的行数,这将在查询变得更复杂时导致较大的性能问题。