2011-06-11 127 views
2

我需要通过时间戳的最大值来获取值和时间戳的记录。值和时间戳的组合是主键。看来有两种方法可以获得最大/最小值。一个查询的例子是通过使用TOP 1 + ORDER BY:带TOP 1 + ORDER BY或max/min + GROUP BY的TSQL查询?

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的“第一个排序n项是O(n次幂),第二个O(n)”到my previous question。那么我有价值和时间戳索引的情况如何?

回答

3

如果您在(value, timestamp)上没有复合索引,那么它们将很差,并且可能同样很差。

对于索引,它们可能与查询优化程序相同。

您还可以快速通过这些看到使用的资源也可以自己试一试:

SET STATISTICS IO ON 
SET STATISTICS TIME ON 

...但最好的方法是使用Graphical Execution Plans

您应该看到在IO巨大差异+有和没有索引的CPU,特别是对于较大的表。

注意:您有一个第三选择

SELECT @value AS value, max(timestamp) 
FROM myTable 
WHERE value = @value 

这将返回一个NULL for no rows这确实使其他两个

0

任何人谁在搜索中发现这一点,并想了解略有不同Postgres(不适用于OP),如果列索引,计划将是相同的。