我需要审查一些代码,发现有人写了这样的代码,但是想不到为什么我的方法更好,而且可能并不更好,那么哪种方法更好/更安全/更有效?
SELECT MAX(a_date) FROM a_table WHERE a_primary_key = 5 GROUP BY event_id
或
SELECT TOP 1 a_date FROM a_table WHERE a_primary_key = 5 ORDER BY a_date
我本来会选择第二个选项,但是我不确定为什么选择那个选项是正确的。
我需要审查一些代码,发现有人写了这样的代码,但是想不到为什么我的方法更好,而且可能并不更好,那么哪种方法更好/更安全/更有效?
SELECT MAX(a_date) FROM a_table WHERE a_primary_key = 5 GROUP BY event_id
或
SELECT TOP 1 a_date FROM a_table WHERE a_primary_key = 5 ORDER BY a_date
我本来会选择第二个选项,但是我不确定为什么选择那个选项是正确的。
当表格和要查询的列均有聚集索引时,MAX()
操作符和查询SELECT TOP 1
的性能几乎相同。
当表格和要查询的列均没有聚集索引时,MAX()
操作符提供更好的性能。
参考:http://www.johnsansom.com/performance-comparison-of-select-top-1-verses-max/
如果你的表进行了索引,性能通常相似。
值得考虑的是:Top
通常只有在对结果进行排序时才有意义(否则,top
是关于什么的?)
对结果进行排序需要更多的处理。
最小值不总是需要排序。(只是取决于情况,但通常不需要使用order by或group by等)
在你的两个例子中,我期望速度/x-plan非常相似。你可以查看统计数据来确保,但我怀疑差异会很大。
这两个查询有所不同。
第一个查询返回多条记录(在内找到每个的最大a_date
)
第二个查询返回一条记录(在内找到最小的a_date
)。
a_primary_key
确实是主键,那么它会生效。但如果它是一个主键,那么在 a_date
中只有一个日期,你既不需要 max
也不需要 top
。 - GSergGROUP BY
吗?还是你假设第二个查询中的ORDER BY
也意味着第一个查询中也有ORDER BY
? - GSerg要使查询结果相同,您需要:
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
了解哪个更快的最好方法是检查查询计划并进行基准测试。有许多因素会影响速度,例如表/堆大小等。即使是同一数据库的不同版本也可能被优化以支持一个查询而不是另一个查询。
我在一张拥有20,00,000+条记录的表上执行了max和top操作,并发现Top比max或min函数更快地给出结果,尤其是在使用order by时。
因此,最好的方法是逐个执行两个查询一段时间,并检查连接经过的时间。
除了那些非常出色的回答指出这两个查询实际上有很大不同之外,我想指出如果没有符合选择条件的行,则结果将非常不同。
这些是非常不同的事情。
MAX
和TOP
函数的作用不同。您的第一个查询将返回每个不同event_id
找到的具有a_primary_key = 5
的a_date
的最大值。第二个查询将仅获取结果集中找到的第一个具有a_primary_key = 5
的a_date
。
a_primary_key
确实是表的主键列,那么查询中提到TOP 1 .. ORDER BY
或者MAX .. GROUP BY
就没有意义了。主键唯一标识单个行,对于单个行来说排序或者求最大值都没有意义,只需要使用SELECT a_date FROM a_table WHERE a_primary_key = 5
即可;无论如何你都会得到0到1个结果。 - Caius Jard