如何改进SQL时间戳范围查询?

时间:2016-09-16 19:29:32

标签: sql sql-server sql-server-2008 azure azure-sql-database

我有一个表records有三个字段:

id - the row id
value - the row value
source - the source of the value
timestamp - the time when the row was inserted (should this be a unix timestamp or a datetime?)

我想执行这样的查询:

SELECT timestamp, value FROM records WHERE timestamp >= a AND timestamp <= b

然而,在包含数百万条记录的表中,此查询效率极低!

我使用Azure SQL Server作为DBMS。这可以优化吗?

如果是这样,您可以提供分步指南(请不要跳过&#34;小&#34;步骤)?是创建索引,重新设计查询语句,重新设计表(分区?)......

谢谢!

2 个答案:

答案 0 :(得分:1)

在要搜索的字段上创建索引后,可以使用between运算符,因此它是单个操作,这对sql最有效。

SELECT XXX FROM ABC WHERE DateField BETWEEN'1 / 1 / 2015'and'12 / 31/2015'

此外,在SQL Server 2016中,您可以使用内存优化表创建范围索引,以用于时间戳等内容。这真的是这样做的方式。

答案 1 :(得分:1)

我建议使用datetime,甚至更好的datetime2数据类型来存储日期数据(datetime2更好,因为它具有更高的精度级别,而精度级别更低将使用更少的存储空间)。

对于您的查询,根据您发布的语句,您希望将时间戳作为键列,然后包含该值。这是因为您使用时间戳作为谓词,并将值与其一起返回。

CREATE NONCLUSTERED INDEX IX_Records_Timestamp on Records (Timestamp) INCLUDE (Value)

话虽如此,请注意列名。我强烈建议不要对列名使用保留关键字,因为它们可能更难以使用。