比如说我正在加入一个数字表来在子查询中的两个日期之间执行某些操作,如下所示:
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
如果我从连接varchars构建日期而不是使用dateadd函数,查询是否会表现更好?
答案 0 :(得分:5)
使用DATEADD以日期时间格式保存数据最有可能更快
请检查此问题:Most efficient way in SQL Server to get date from date+time?
接受的答案(不是我!)演示了DATEADD对字符串的转换。太多年前我见过另一个显示相同的
答案 1 :(得分:4)
请注意日期和日期,请查看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
要查看哪个查询执行得更好,执行两个查询并查看执行计划,您还可以使用统计信息io和统计时间来获取执行查询所需的读取次数和执行查询的时间
答案 2 :(得分:3)
我不会选择连接varchars。
DateAdd将比字符串连接更好地执行,并且转换为DATETIME。
与往常一样,您最好的选择是分析2个选项,并确定最佳结果,因为没有指定DB。
答案 3 :(得分:3)
很可能不会有这样或那样的差异。 我会跑这个:
SET STATISTICS IO ON;
SET STATISTICS TIME ON;
后跟您的查询的两种变体,以便您查看和比较实际执行成本。
答案 4 :(得分:2)
只要您的谓词计算不包含对您要查询的表的列的引用,您的方法无论哪种方式都无关紧要(为了清晰起见)。
如果您要在计算中包含Table1
中的内容,我会注意表扫描或覆盖索引扫描,因为它可能不再是sargable。
无论如何,请检查(或发布!)execution plan以确认。
答案 5 :(得分:2)
为什么要使用相关的子查询开头?这会让你的速度远远超过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