Dav*_*d C 6 sql t-sql sql-server performance
费用不仅在SELECT中使用DateAdd函数,还在WHERE中使用; 或者使用Sub Query,它最初会返回比我需要的更多的数据,但是可以在数据库上再次使用DateAdd函数进行过滤.
执行计划似乎暗示它们是相同的.我想知道哪个更有效率?
DECLARE @DateFrom DateTime
SET @DateFrom = '2011-05-27'
DECLARE @DateTo DateTime
SET @DateTo = '2011-06-27'
SELECT id, name,
dateAdd(hour, datediff(hour, getdate(), getutcdate()), --UTC offset
dateadd(second, itsm_requiredbyx, '1/1/1970 12:00 AM')) as itsm_requiredbyx
FROM tablename
WHERE dateAdd(hour, datediff(hour, getdate(), getutcdate()), --UTC offset
dateadd(second, itsm_requiredbyx, '1/1/1970 12:00 AM'))
BETWEEN @DateFrom AND @DateTo
ORDER BY itsm_requiredbyx desc
---------------------------------------------------------------------------------------------
SELECT *
FROM
(
select id, name,
dateAdd(hour, datediff(hour, getdate(), getutcdate()), --UTC offset
dateadd(second, itsm_requiredbyx, '1/1/1970 12:00 AM')) as itsm_requiredbyx
from tablename
) RR
WHERE itsm_requiredbyx BETWEEN @DateFrom AND @DateTo
ORDER BY itsm_requiredbyx desc
Run Code Online (Sandbox Code Playgroud)
我认为你使用的是哪一个并不重要.并执行计划同意.
但似乎你正在对列进行计算itsm_requiredbyx,然后检查结果是否在两个外部值之间,@DateFrom并且@DateTo.这样,WHERE在应用条件之前,函数将处理来自该字段的所有日期时间,并且不能使用索引.@ DOK答案中的第二个链接(十个常见SQL编程错误)提供了有关何时以及何时发生这种情况的更详细信息.
如果你不做任何计算的列,但你做的(逆转)的计算,而不是外部的值,然后检查是否itsm_requiredbyx是这两个计算值之间,查询可以使用索引的itsm_requiredbyx(和功能将只调用两次而不是表中的每一行).
| 归档时间: |
|
| 查看次数: |
2682 次 |
| 最近记录: |