这在sql min或top中更有效

时间:2015-04-28 05:54:02

标签: sql sql-server

在sql min或top中效率更高?

select MIN(salary) from ABC
select top 1 salary from ABC order by salary asc

3 个答案:

答案 0 :(得分:3)

最佳方式是查看执行计划,结果可能会有所不同。

我在我当前的环境中尝试了这一点,MIN()似乎工作得更快,在第一种情况下SORT BY几乎吃掉了所有东西。 Execution plans

使用MIN()索引扫描需要96%的执行时间,这很好。 表包含大约10亿条记录。

答案 1 :(得分:3)

您正在寻找最低工资。所以使用MIN(salary);它就是为了这个目的而制造的。因此,您的查询尽可能具有可读性和可维护性。由于使用MIN或MAX,我从未见过有人遇到性能问题。

除了在列表中找到最小值的任务非常简单。排序列表的任务(仅保留第一行)是另一个。如果你很幸运,DBMS会看到这一点并且根本没有排序,但只是为你查找最小值,然后你已经和MIN在一起了。

如果对于某些奇迹MySQL执行TOP 1查询的速度比MIN查询快,那么请考虑这是一个缺陷,但坚持使用MIN查询,并等待未来版本的MySQL更好地执行: - )

仅当您需要记录中的MIN或MAX值时才使用TOP n查询。

答案 2 :(得分:2)

在sql server 2012上进行的测试(你没有要求特定版本,这就是我所拥有的):

-- Create the table
CREATE TABLE ABC (salary int)

-- insert sample data
DECLARE @I int = 0

WHILE @i < 1000000 -- that's right, a million records..
BEGIN
   INSERT INTO ABC VALUES (@i)
   SET @I = @I + 1
END

包括执行计划并运行两个查询:

select MIN(salary) from ABC
select top 1 salary from ABC order by salary asc

结果:

  • 没有索引:前1的查询成本为94%,最小为6%。
  • 使用工资索引 - 两者的查询成本均为50%(如果索引是否已群集,则无关紧要)。

没有索引: Execution plan without an index

使用索引:(群集和非群集导致相同的执行计划) enter image description here