我不得不审查一些代码,并且遇到了某些人所做的事情,并且无法想到为什么我的方式更好而且可能不是,因此,哪个更好/更安全/更有效?< / p>
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
我会选择第二种选择,但我不知道为什么,如果那是对的。
答案 0 :(得分:37)
1)当表上有聚簇索引并且要查询的列时,MAX()
运算符和查询SELECT TOP 1
的性能几乎相同。
2)当表上没有聚集索引并且要查询的列时,MAX()
运算符会提供更好的性能。
参考:http://www.johnsansom.com/performance-comparison-of-select-top-1-verses-max/
答案 1 :(得分:17)
如果您的表已编入索引,则效果通常类似。
值得考虑的是:Top
通常只有在您订购结果时才有意义(否则, 的top
?)
订购结果需要更多处理。
Min并不总是需要订购。 (只是取决于,但通常你不需要按顺序或分组等)。
在你的两个例子中,我希望speed / x-plan非常相似。你可以随时转向你的统计数据,但我怀疑差异是否显着。
答案 2 :(得分:10)
他们是不同的查询。
第一个返回许多记录(a_date
内找到的每个event_id
的最大a_primary_key = 5
第二个记录返回一条记录(a_date
内找到的最小a_primary_key = 5
)。
答案 3 :(得分: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
了解哪个更快的最佳方法是检查查询计划并执行基准测试。有许多因素会影响速度,例如表/堆大小等。甚至可以优化同一数据库的不同版本以支持一个查询而不是另一个查询。
答案 4 :(得分:3)
我在一张包含20,000,000条记录的桌子上执行max和top, 并且发现 Top给出了比max或min函数更快的结果。
所以,最好的方法是逐个执行你的查询一段时间,然后检查连接的经过时间。
答案 5 :(得分:0)
MAX
和TOP
功能不同。您的第一个查询将返回a_date
找到的最大值,该值对于找到的每个不同a_primary_key = 5
都有event_id
。第二个查询只会抓取第一个a_date
,并在结果集中找到a_primary_key = 5
。
答案 6 :(得分:-1)
我进行了一次实验,当我使用最小值/最大值之类的汇总时,聚集索引成本为98%,但是当我使用TOP和Order By时,聚集索引扫描成本降低到了45%。当涉及到大型数据集的查询时,TOP和Order By组合将更便宜,并且结果更快。