获取当天下达的订单数量

时间:2015-05-11 06:18:09

标签: sql-server

我正在使用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)

orderti上的非聚集索引。

我想知道上面提到的2个查询的写作风格有什么不同。

哪一个有效?

任何帮助? 谢谢, 奇奥

2 个答案:

答案 0 :(得分:1)

根据您的问题

查询1

select count(*) from table where orderti=getdate()

此查询不会为您提供当天的订单,因为

  1. ordertidatetime,并且还包含时间部分
  2. getdate()同时包含当前日期和时间
  3. 此查询试图通过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.
    

    Execution Plans 更新:有大约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

  1. 最好不要使用函数作为标准实践来包装已过滤的列,当然,因为优化程序在2012版本中是切分器,因此无效。

  2. 虽然2012版本的优化器正在使用索引查找,这意味着它可以节省CAST的CPU周期