代码之家  ›  专栏  ›  技术社区  ›  Daniel Sam

dateadd如何影响SQL查询的性能?

  •  8
  • Daniel Sam  · 技术社区  · 15 年前

    例如,我正在联接一个数字表,以便在子查询中的两个日期之间执行某些操作,例如:

    select n
          ,(select avg(col1)
              from table1
             where timestamp between dateadd(minute, 15*n, @ArbitraryDate) 
                                 and dateadd(minute, 15*(n+1), @ArbitraryDate))
      from numbers
     where n < 1200
    

    如果我从连接varchar构造日期,而不是使用dateadd函数,那么查询的性能会更好吗?

    6 回复  |  直到 15 年前
        1
  •  5
  •   Community CDub    7 年前

    使用dateadd以datetime格式保存数据最可能更快

    检查此问题: Most efficient way in SQL Server to get date from date+time?

    接受的答案(不是我!)演示dateadd over字符串转换。很多年前我又看到过一个同样的

        2
  •  4
  •   SQLMenace    15 年前

    小心在和日期之间,看一下 How Does Between Work With Dates In SQL Server?

    我曾经将一个查询从24小时运行到36秒。不要在列上使用日期函数或转换,请参见以下内容: Only In A Database Can You Get 1000% + Improvement By Changing A Few Lines Of Code

    要查看哪个查询执行得更好,可以执行两个查询并查看执行计划,还可以使用statistics io和statistics time来获取执行查询所需的读取次数和时间。

        3
  •  3
  •   Adriaan Stander    15 年前

    我不赞成连接varchars。

    与字符串包含和强制转换为日期时间相比,dateadd的性能更好。

    和往常一样,最好的办法是分析2个选项,并确定最佳结果,因为没有指定db。

        4
  •  3
  •   A-K    15 年前

    最有可能的是,两者之间不会有任何不同。 我会运行这个:

    SET STATISTICS IO ON;
    SET STATISTICS TIME ON;
    

    然后是查询的两个变量,这样您就可以看到并比较实际的执行成本。

        5
  •  2
  •   shsteimer    15 年前

    只要谓词计算不包括对所查询表的列的引用,那么您的方法无论如何都不重要(为了清晰起见)。

    如果你要包括 Table1 不过,在计算中,我会注意表扫描或覆盖索引扫描,因为它可能不再是 sargable .

    在任何情况下,检查(或张贴!)这个 execution plan 确认。

        6
  •  2
  •   A-K    15 年前

    为什么要使用相关的子查询开始?这会比dateadd慢得多。它们就像光标,一行一行地工作。 这样的东西行吗?

     select n.n , avgcol1   
        from numbers n 
        left outer join  
            (
            select avg(col1) as avgcol1, n
            from table1 
            where timestamp between dateadd(minute, 15*n, @ArbitraryDate)  
               and dateadd(minute, 15*(n+1), @ArbitraryDate)
            Group by n
            ) t
         on n.n = t.n
        where n < 1200