我需要通过最大时间戳获取值和时间戳的记录。值和时间戳的组合是主键。似乎有两种方法可以获得最大/最小值。一个查询示例是使用TOP 1 + ORDER BY:
SELECT TOP 1
value, timestamp
FROM myTable
WHERE value = @value
ORDER BY timestamp DESC
另一个是MAX()+ GROUP BY:
SELECT value, max(timestamp)
FROM myTable
WHERE value = @value
GROUP BY value
第二个在性能方面是否优于第一个?我读了one person's comment“将第一个项目排序为O(n次幂为2),第二个O(n)”为my previous question。我对值和时间戳都有索引的情况怎么样?
答案 0 :(得分:3)
如果你在(value, timestamp)
上没有综合索引,那么他们就会很穷,而且可能同样很差。
使用索引时,由于查询优化工具,它们可能会相同。
您还可以使用这些来快速测试自己使用的资源:
SET STATISTICS IO ON
SET STATISTICS TIME ON
...但最好的方法是使用Graphical Execution Plans
您应该看到IO + CPU在有和没有索引的情况下存在巨大差异,尤其是对于较大的表。
注意:您有第3个选项
SELECT @value AS value, max(timestamp)
FROM myTable
WHERE value = @value
这将返回NULL for no rows,这确实与其他两个
略有不同答案 1 :(得分:0)
对于在搜索中发现此信息且想要了解Postgres(不适用于OP)的任何人,如果列被编入索引,则计划将是相同的。