计算多组数据的平均值(性能问题)
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
语句。不过,我不确定这是这里的瓶颈。也许您想研究流式传输结果,而不是等待全部获取。
【讨论】:
以上是关于计算多组数据的平均值(性能问题)的主要内容,如果未能解决你的问题,请参考以下文章