计算多组数据的平均值(性能问题)

Posted

技术标签:

【中文标题】计算多组数据的平均值(性能问题)【英文标题】:Calculating average of multiple sets of data (performance issue) 【发布时间】:2018-07-13 22:04:50 【问题描述】:

我需要进行计算,例如按时间范围集合分组的所选数据的平均值。

示例: 存储数据的表有几个主要列,它们是: |时间戳 |外部标识 |价值 |

现在我想计算 20 组(或更多)日期范围的平均值: 1) 2000-01-01 00-00-00 -> 2000-01-04 00-00-00 2) 2000-01-04 00-00-00 -> 2000-01-15 00-00-00 ...

重要的是组之间没有间隙和交叉点,因此这意味着第一个日期和最后一个日期涵盖了整个时间范围。

另一个重要的事情是,在“date_from”到“date_to”的集合中,可以有集合之外的行(不需要的 external_id)。

我尝试了两种方法: 1) 使用 SQL 查询中的平均函数对每个“时间范围”步骤执行查询(但我不喜欢这样 - 所有查询都消耗太多时间,而且执行多个查询听起来不是好方法)

2) 我已经选择了所有需要的行(在一个 SQL 请求中),然后我对结果进行了循环。问题是我必须检查“数据组”当前日期时间所属的每个步骤。这看起来像是一种更好的方法(从 SQL 的角度来看),但现在由于循环中的循环,我的性能不太好。我需要弄清楚如何避免在主循环中执行循环(检查当前时间戳属于哪个组)。

任何建议都会很有帮助。

【问题讨论】:

【参考方案1】:

实际上这两种方法都很好,如果你有的话,它们都可以从数据库中time_stamp 列的索引中受益。我会尽力为他们提供建议:

    多个查询并不是一个坏主意,您的数据看起来是相当静态的,您可以在 20 个不同的连接中运行 20 个类似select avg(value) from data where time_stamp between date_from and date_to 的查询以加快整个操作。您也无需将大量数据从数据库传输到您的客户端。缺点是您需要包含一个额外的where 条件来排除具有不需要的external_id 值的行。如果这些值很多,这会使查询复杂化,并且会稍微减慢处理速度。

    在这里,您可以在发送前按time_stamp 索引对服务器上的数据进行排序,然后检查您当前的项目是否来自新的数据范围(因为排序后,您可以确保后面的项目来自较晚的日期)。这会将内部循环减少为if 语句。不过,我不确定这是这里的瓶颈。也许您想研究流式传输结果,而不是等待全部获取。

【讨论】:

以上是关于计算多组数据的平均值(性能问题)的主要内容,如果未能解决你的问题,请参考以下文章

计算平均值时性能不佳

哪个更好计算星级平均值(在性能意义上)

性能测试指标都有哪些?

pyspark 时间序列数据的高性能滚动/窗口聚合

计算循环内的平均值会降低性能

如何检索“平均值”性能计数器?