Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql MAX vs Top 1-哪个更好?_Sql_Sql Server_Tsql - Fatal编程技术网

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