提高“最后一小时交易”(或“日期之间”)查询的效率

时间:2015-03-02 13:48:32

标签: sql-server

发现对这个非常大的表(约1亿条记录)的查询效率低下(通常是20-30秒,但可能更多),但不知道该怎么办:

SELECT @TRXCOUNT = count(1)
FROM inbound.[Transaction] WITH (NOLOCK)
WHERE CreatedTimeStamp BETWEEN DATEADD(HH, - 1, SYSDATETIME()) AND SYSDATETIME()

执行计划显示Index Scan(NonClustered)成本93%

3 个答案:

答案 0 :(得分:3)

从您的评论中可以看出,您没有基于CreatedTimeStamp的索引。将其包含在另一个索引中并不能提高查询效率 - 目前仍需要进行表扫描。

我建议你添加一个新索引(例如名为IX_Inbound_Transaction_CreatedTimeStamp)。它不需要聚集,因为索引是所有查询都需要查看的。

答案 1 :(得分:1)

你云尝试两件事:

  1. 之前计算DATEADD(HH, - 1,SYSDATETIME())的值,将其存储在变量中并在查询中使用变量。我知道,这应该没关系,但你可以随时查看。
  2. 检查您在CreatedTimeStamp上的索引是否健康(你有一个,对吧?)。来自fine manual的一些帮助。

答案 2 :(得分:1)

大于可能比BETWEEN更快。

SELECT @TRXCOUNT = count(1)
FROM inbound.[Transaction] WITH (NOLOCK)
WHERE CreatedTimeStamp > SYSDATETIME() - INTERVAL 30 MINUTE

语法可能不准确。 mySQL vs SQL