使用TOP 1 + ORDER BY或max / min + GROUP BY进行SQL查询?

时间:2011-06-11 19:43:50

标签: sql tsql

我需要通过最大时间戳获取值和时间戳的记录。值和时间戳的组合是主键。似乎有两种方法可以获得最大/最小值。一个查询示例是使用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。我对值和时间戳都有索引的情况怎么样?

2 个答案:

答案 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)的任何人,如果列被编入索引,则计划将是相同的。