我有一个表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;步骤)?是创建索引,重新设计查询语句,重新设计表(分区?)......
谢谢!
答案 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)
话虽如此,请注意列名。我强烈建议不要对列名使用保留关键字,因为它们可能更难以使用。