SQL效率 - 使用dateAdd函数查询两次; 或SubQuery和DateAdd函数一次; 在BETWEEN的日期

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)

ype*_*eᵀᴹ 7

我认为你使用的是哪一个并不重要.并执行计划同意.

但似乎你正在对列进行计算itsm_requiredbyx,然后检查结果是否在两个外部值之间,@DateFrom并且@DateTo.这样,WHERE在应用条件之前,函数将处理来自该字段的所有日期时间,并且不能使用索引.@ DOK答案中的第二个链接(十个常见SQL编程错误)提供了有关何时以及何时发生这种情况的更详细信息.

如果你不做任何计算的列,但你做的(逆转)的计算,而不是外部的值,然后检查是否itsm_requiredbyx是这两个计算值之间,查询可以使用索引itsm_requiredbyx(和功能将只调用两次而不是表中的每一行).