2011-08-25 142 views
25

我不得不复习一些代码,并且遇到了某人做了某事,并且想不出我的方式更好的原因。它可能不是,那么,哪个更好/更安全/更有效?MAX vs Top 1 - 哪个更好?

SELECT MAX(a_date) FROM a_table WHERE a_primary_key = 5 GROUP BY event_id 

OR

SELECT TOP 1 a_date FROM a_table WHERE a_primary_key = 5 ORDER BY a_date 

我会去与第二个选项,但我不知道为什么,如果这是正确的。

回答

13

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

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

订购的结果需要更多的处理。

最小值并不总是需要排序。 (只要看情况而定,但通常你不需要按顺序排序等)

在你的两个例子中,我期望速度/ x-plan非常相似。你总是可以转向你的数据来确定,但我怀疑这种差异是否会显着。

+1

SQL Server TOP 1的行为与使用rowNum = 1的Oracle不同。 Oracle实际上并没有抢在订购之前找到的第一个,所以这个方法仅对SQL Server有效。这个TOP 1 vs Max()的另一个好处是,只要你包含适用的顺序,你可以根据需要抓取尽可能多的列。我使用Max()进行了测试,发现即使使用GROUP BY,它也不会只产生1条记录。也许有人更强大的mojo可以说,如果你想从多列无w/o子查询获得顶部如何获得一行? – gordon

10

他们是不同的查询。

第一个返回多个记录

第二个返回一个记录(最小a_date内发现a_primary_key = 5)(用于内a_primary_key = 5找到的每个event_id最大a_date)。

+2

o.O第一个查询仍然会返回一条记录 –

+1

@Shredder提供'a_primary_key'实际上是一个主键,它会的。但是,如果它是主键,则'a_date'中只有一个日期,并且既不需要'max'也不需要'top'。 – GSerg

+0

即使不是,它仍会返回一条记录。 http://www.w3schools.com/sql/sql_func_max.asp –

0

MAXTOP的功能不同。您的第一个查询将返回找到的最大值a_date,其中a_primary_key = 5找到的每个不同的event_id。第二个查询将简单地抓取第一个a_date,并在结果集中找到a_primary_key = 5

+1

它不会获取第一个值。 'top'与'as by asc'结合时,会选择最小的值。 – GSerg

+0

你是否吸烟兄弟,给我一些..它*会*抓住找到的第一个值,是的,在这种情况下,它将是最小的,因为ASC的排序从最小到最大,使第一个值最小.. –

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 

知道这是更快,最好的办法是检查查询计划,做你的基准。影响速度的因素很多,例如表/堆大小等。甚至可以优化相同数据库的不同版本,以支持一个查询。

+3

不需要在第一个示例中进行分组(因为根据WHERE子句只有一个组)。 – Chains

+0

@kuru:我不确定你可以使用一个集合函数,但如果是这样的话......你是对的 – vol7ron

+3

只要你只选择aggs(就像你在回答中一样),你没事。如果你在select中包含一个非agg值,那么你确实需要一个group。 – Chains

0

我在一个表上有20,00,000+记录执行max和顶部, 发现顶部比最大或最小功能可以较快导致与秩序。

所以,最好的方法是在一段时间内逐个执行您的查询,并检查连接所用时间。