我正在使用sql-server 2012
查询
1.select count(*) from table where orderti=getdate()
2.select count(*) from table where orderti>=convert(date,getdate()) and orderti<
dateadd(day,convert(date,getdate())
表结构是:
销售(orderti datetime)
我想知道上面提到的2个查询的写作风格有什么不同。
哪一个有效?
任何帮助? 谢谢, 奇奥
答案 0 :(得分:1)
根据您的问题
查询1
select count(*) from table where orderti=getdate()
此查询不会为您提供当天的订单,因为
orderti
为datetime
,并且还包含时间部分getdate()
同时包含当前日期和时间此查询试图通过orderti =当前日期和时间获取所有订单,而不是您需要的。
您正在寻找的查询是
select count(*) from table where CONVERT(DATE,orderti)=CONVERT(DATE,getdate())
查询2
您要查找的查询是
select count(*) from table where orderti>=convert(date,getdate()) and orderti< dateadd(day,1,convert(date,getdate()))
关于你的问题
哪一个有效?
根据统计数据和执行计划,两个查询都执行索引查找并且效率相同。
Table 'sales'. Scan count 1, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'sales'. Scan count 1, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
更新:有大约650,000条记录,统计数据有所不同,但计划保持不变。
Table 'sales'. Scan count 1, logical reads 34, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'sales'. Scan count 1, logical reads 19, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
我建议使用查询2,因为它具有较少的逻辑读取,并且没有CAST/Convert
。
答案 1 :(得分:0)
由于几个原因,我更喜欢选项-2
最好不要使用函数作为标准实践来包装已过滤的列,当然,因为优化程序在2012版本中是切分器,因此无效。
虽然2012版本的优化器正在使用索引查找,这意味着它可以节省CAST的CPU周期