MAX vs Top 1 - 哪个更好?

Cra*_*aig 36 sql t-sql sql-server

我不得不审查一些代码,并且遇到了某人所做的事情,并且无法想出我的方式更好的原因.它可能不是,那么哪个更好/更安全/更有效?

SELECT MAX(a_date) FROM a_table WHERE a_primary_key = 5 GROUP BY event_id
Run Code Online (Sandbox Code Playgroud)

要么

SELECT TOP 1 a_date FROM a_table WHERE a_primary_key = 5 ORDER BY a_date
Run Code Online (Sandbox Code Playgroud)

我会选择第二种选择,但我不确定为什么,如果这是对的.

Jun*_*r M 39

1)当表上有聚簇索引和要查询的列时,MAX()运算符和查询的SELECT TOP 1性能几乎相同.

2)当表和要查询的列上没有聚簇索引时,MAX()运营商提供更好的性能.

参考:http://www.johnsansom.com/performance-comparison-of-select-top-1-verses-max/


Cha*_*ins 17

如果您的表已编入索引,则性能通常类似.

值得考虑的,但:Top通常才有意义,如果你订购你的结果(否则top是什么?)

订购结果需要更多处理.

Min并不总是需要订购.(只是取决于,但通常你不需要订购或分组等)

在你的两个例子中,我希望speed/x-plan非常相似.您可以随时转向您的统计数据,但我怀疑差异是否显着.

  • 上面的'max'代码返回多个条目的原因是因为团购.它为每个事件ID返回一个MAX.所以它实际上与'top'示例有不同的语义. (2认同)

GSe*_*erg 11

它们是不同的查询.

第一个返回多个记录(最大a_date为各event_id中找到a_primary_key = 5)

第二个返回一条记录(在其中a_date找到的最小记录a_primary_key = 5).

  • @Shredder您可能会因为发布到w3schools的链接而被涂焦油和羽毛.:) (4认同)
  • oO第一个查询仍然会返回一条记录 (2认同)
  • @Shredder 如果`a_primary_key` 实际上是一个主键,它会的。但是如果是主键,则`a_date`中只有一个日期,不需要`max`和`top`。 (2认同)
  • @Shredder你能看到第一个查询有`GROUP BY`,或者你假设第二个查询中的`ORDER BY`意味着第一个查询中还有`ORDER BY`? (2认同)

vol*_*ron 5

要使查询具有相同的结果,您需要:

SELECT MAX(a_date) FROM a_table WHERE a_primary_key = 5

SELECT TOP 1 a_date FROM a_table WHERE a_primary_key = 5 ORDER BY a_date DESC
Run Code Online (Sandbox Code Playgroud)

了解哪个更快的最佳方法是检查查询计划并执行基准测试.有许多因素会影响速度,例如表/堆大小等.甚至可以优化同一数据库的不同版本以支持一个查询而不是另一个查询.

  • 不需要在第一个示例中进行分组(因为根据WHERE子句,您只有一个组). (4认同)
  • 只要你只选择aggs(就像你的答案一样),你就可以了.如果在select中包含非agg值,则需要group by. (3认同)

Jay*_*iya 5

我在一张有 20,00,000 多条记录的表上执行 max 和 top ,发现Top通过 order by 比 max 或 min 函数给出更快的结果

因此,最好的方法是在一段时间内一一执行您的查询并检查连接经过的时间。