Sql MAX vs Top 1-哪个更好?
我不得不检查一些代码,遇到一些人做过的事情,我想不出为什么我的方式更好,也可能不是,那么,哪个更好/更安全/更高效Sql MAX vs Top 1-哪个更好?,sql,sql-server,tsql,Sql,Sql Server,Tsql,我不得不检查一些代码,遇到一些人做过的事情,我想不出为什么我的方式更好,也可能不是,那么,哪个更好/更安全/更高效 SELECT MAX(a_date) FROM a_table WHERE a_primary_key = 5 GROUP BY event_id 或 我会选择第二个选项,但我不确定为什么,如果这是正确的。它们是不同的查询 第一个返回多条记录(在a\u主键=5中找到的每个事件id的最大a\u日期) 第二个返回一条记录(在a_primary_key=5中找到的最小a_date)。M
SELECT MAX(a_date) FROM a_table WHERE a_primary_key = 5 GROUP BY event_id
或
我会选择第二个选项,但我不确定为什么,如果这是正确的。它们是不同的查询 第一个返回多条记录(在
a\u主键=5
中找到的每个事件id
的最大a\u日期
)
第二个返回一条记录(在
a_primary_key=5
中找到的最小a_date
)。MAX
和TOP
的功能不同。您的第一个查询将为找到的每个不同的事件id
返回一个a_primary_key=5的a_date
的最大值。第二个查询将简单地获取第一个a_日期
,在结果集中找到一个a_主键=5
。如果您的表被索引,性能通常是相似的
但是值得考虑的是:Top
通常只有在您对结果排序时才有意义(否则,Top
什么?)
排序结果需要更多的处理
Min并不总是需要订购。(视情况而定,但通常不需要按订单或分组等)
在您的两个示例中,我希望speed/x-plan非常相似。您可以随时查看您的统计数据以确定,但我怀疑差异是否显著。要使查询具有相同的结果,您需要:
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
要知道哪个更快,最好的方法是检查查询计划并进行基准测试。有许多因素会影响速度,如表/堆大小等,甚至同一数据库的不同版本也可能会进行优化,以使一个查询优于另一个查询。1)当表和要查询的列上有聚集索引时,MAX()
运算符和查询选择TOP 1
将具有几乎相同的性能
2) 当表和要查询的列上没有聚集索引时,MAX()
操作符提供了更好的性能
参考资料:我在一个包含20,00000条以上记录的表上执行max和top,
并发现,Top以比max或min函数更快的顺序给出结果
所以,最好的方法是一个接一个地执行查询一段时间,然后检查连接所用的时间。我做了一个实验,当我使用像Min/Max这样的聚合时,聚集索引成本为98%,但当我使用TOP和Order by时,聚集索引扫描成本降低到45%。在查询大型数据集时,TOP和Order By组合的成本更低,结果更快。o.o第一次查询仍将返回一个结果record@Shredder如果a_primary_key
实际上是一个主键,那么它会。但如果它是主键,则在a_date
中只有一个日期,并且不需要max
或top
。即使它不是主键,它仍将返回一条记录@碎纸机您可以看到第一个查询中有分组依据
,或者您是否假设第二个查询中的按
排序意味着第一个查询中也有按
排序?@shreader您可能会因为发布到w3schools的链接而被涂上焦油和羽毛。:)它不会获取第一个值Top
与asc的订单组合时,将选择最小的值。如果你是smokin兄弟,请给我一些。。它将获取找到的第一个值,是的,在这种情况下,它将是最小的,因为ASC的排序从最小到最大,使第一个值最小。在第一个示例中,无需分组(因为每个WHERE子句只有一个group)。@kuru:我不确定您是否可以使用不带group by的聚合函数,但如果是这样的话。。。你是对的,只要你只选择了AGG(就像你在回答中一样),你就可以了。如果在select中包含一个非agg值,那么您确实需要一个group by。感谢您的跟进,这是我最初的想法,但我会相信您的话并更新答案,+1 Cheers SQL Server TOP 1的行为与Oracle使用rowNum=1时的行为不同。Oracle实际上会在订购之前获取它找到的第一个,因此此方法仅对SQL Server有效。这个TOP 1 vs Max()的另一个好处是,只要包含适用的排序,就可以获取任意数量的列。我使用Max()进行了测试,发现即使使用groupby,它似乎也不会只生成一条记录。如果你想在没有子查询的情况下从多个列中获取顶部,也许像mojo这样强大的人可以说如何只获取一行?上面的“max”代码返回多个条目的原因是因为团购。它将为每个事件Id返回一个MAX。因此它实际上与“top”示例具有不同的语义。如果a_primary_key
确实是表的主键列,则没有必要使用提及top 1的查询。。按
或
最大值排序。。分组依据。主键唯一地标识一行;没有点排序或最大化一行,只需说从一个表中选择一个日期,其中一个主键=5
;不管怎样,您都会得到0到1个结果
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