内置SQL函数的时间复杂度,例如sum,count,avg

时间:2009-10-07 20:49:46

标签: sql mysql sql-server oracle time-complexity

mysql,sql server,oracle和其他函数中count,sum,avg或任何其他内置“math”函数的函数的时间复杂度是多少?

有人会认为调用sum(myColumn)是线性的。

但是计数(1)不是。怎么样,真正的时间复杂性是什么?

在一个完美的世界里,我希望sum,avg和count为O(1)。但我们不住在其中一个,是吗?

4 个答案:

答案 0 :(得分:4)

  

mysql,sql server,oracle和其他函数中count,sum,avg或任何其他内置“math”函数的函数的时间复杂度是多少?

  • MySQL MyISAM COUNT(*) GROUP BY O(1) MAX({1}}

    它存储在表格元数据中。

  • 在所有系统中,MINGROUP BY在没有O(log(n))的索引表达式上为O(n)(对数)。

    使用单个索引搜索获取它们。

  • 汇总函数为GROUP BY(线性),未使用GROUP BYHASH时使用O(n log(n))

  • GROUP BY使用SORT时,汇总函数为SORT

所有值都应该被提取,计算并存储在状态变量中(可以存储在哈希表中)。

此外,使用{{1}}时,也应对其进行排序。

答案 1 :(得分:3)

在SQL中,聚合的数学函数复杂性完全无关紧要。唯一真正重要的是数据加入的复杂性:选择哪种访问路径(表扫描,索引范围扫描,索引搜索等)以及读取的页数。每个聚合的内部可能略有不同,但它们的工作方式几乎相同(保持运行状态并计算每个输入值的运行聚合),并且绝对存在 NO 聚合输入两次,所以它们都是O(n)作为内部实现,其中'n'是输入到聚合的记录数(不一定是表中记录的数量!)。

某些聚合具有内部快捷方式,例如。如果可能,COUNT(*)可以从某些系统的元数据返回计数。

答案 2 :(得分:1)

注意:这是基于我对SQL查询规划器如何工作的理解的推测,并且可能不完全准确。

我相信所有聚合函数,或者至少你在上面命名的“数学”函数应该是O(n)。查询将大致如下执行:

  1. 获取与连接谓词和过滤谓词匹配的行(即“WHERE子句”)
  2. 根据GROUP BY子句创建行组。为没有GROUP BY
  3. 的查询创建单个行组
  4. 对于每个行组,将聚合函数应用于组中的行。对于诸如SUM,AVG,MIN,MAX以及非数字函数(如CONCAT)之类的东西,有简单的O(n)算法,我怀疑它们是使用的。在步骤#2中创建的每个行组的输出集中创建一行
  5. 如果存在HAVING谓词,请使用此谓词过滤输出行
  6. 但请注意,即使聚合函数为O(n),操作也可能不是。如果您创建一个笛卡儿将表连接到自身的查询,您将看到O(n * n)最小值只是为了创建初始行集(步骤#1)。排序以创建行组(步骤#2)可能是O(n lg n),并且可能需要磁盘存储来进行排序操作(与内存操作相反),因此如果您是查询,则查询可能仍然表现不佳操纵很多行。

答案 3 :(得分:0)

对于大数据仓库样式的查询,主要数据库可以并行化任务,因此有多个CPU在其上工作。因此,在协调并行线程的成本与使用多个CPU的好处之间存在不一致的阈值点。