在没有ANY()的情况下哪个是最便宜的聚合函数

时间:2011-05-19 14:28:04

标签: mysql sql tsql

我通常使用DBMS的MAX()或MIN()没有ANY()聚合函数。

mySQL和MS-SQL中是否有更便宜的东西?

5 个答案:

答案 0 :(得分:3)

ANSI SQL-92

中有 ANY汇总

任何限定符,以匹配SOME和ALL

MIN和MAX是正确的聚合......完全不相关,不应该进行比较

编辑:

只有MySQL具有“ANY”聚合的含糊不清:SQL Server,Sybase,Oracle,PostGres都没有。见Do all columns in a SELECT list have to appear in a GROUP BY clause

答案 1 :(得分:2)

MySQL 不需要 ANY()聚合。

如果我做了

SELECT field1, field2, SUM(field3) FROM table1 
GROUP BY field2

微软T-SQL会抱怨但

MySQL将默默执行

SELECT whatever(field1), field2, SUM(.... 

当然比SELECT max(field1), field2, SUM(.... GROUP BY field2

更快

MySQL支持ANY,但SELECT ANY(field1) ...不起作用,因为ANY是一个类似于INALL的运算符。
见:http://dev.mysql.com/doc/refman/5.0/en/any-in-some-subqueries.html

我喜欢MySQL

答案 2 :(得分:1)

MIN和MAX同样(昂贵)。

答案 3 :(得分:0)

好的,让我们重新解释原来的问题。如果提供了EXISTS-aggregate函数,那将是很好的,而不是任何不明确而不是SQL标准的ANY。

我曾多次使用“count(outer.column)> 0”模仿“exists(outer.column)”,这可能会更便宜,因为无论如何都会丢弃计数。

答案 4 :(得分:0)

从 MySQL 5.7(2015 年 10 月发布)开始,实际上有一个功能! any_value(col) 明确满足此需求 - 有关详细信息,请参阅 documentation

但是,需要注意的是,它似乎仍然不能保证短路,仍然可能执行全扫描,因此可能无法达到更高效率的目标。如果 MySQL 对此很聪明,那么就有一些机会,尽管测试是明智的。在两种情况下它可能会有所帮助:

  • 如果要聚合的值特别大且未编入索引,则任何比较的成本都会很高。
  • 如果利用 max 或其他占位符聚合可能会使代码中的意图变得不那么明确。例如,max 可能暗示其存在有某种原因,而不是从分组中获取“任何东西”,但 any_value 会明确定义意图,而无需额外注释。

玩具样品:

select
col, 
any_value(a.val) as any_val
from (
    select 'blue' as col, 3 as val
    union all
    select 'blue' as col, 2 as val
    union all
    select 'green' as col, 1 as val
) as a
group by col