1

我有一个包含每 0.1 秒收集一次的记录的数据库,我需要对给定日期的数据进行时间平均,每 20 分钟一次。所以我需要每 20 分钟返回一天的数据,即 24*3 的值。
目前,我每天每 20 分钟对数据库进行一次单独的 AVG 调用,即 24*3 次调用。我与数据库的连接似乎有点慢(它是远程的),并且需要大约 5 分钟才能完成所有平均值。做一个查询,我访问一整天的数据然后平均每 20 分钟会更快吗?如果有助于回答这个问题,我必须在平均之前对数据进行一些算术运算,即乘以几个表列。

4

7 回答 7

1

一般来说,减少查询的数量是一个好主意。聚合并在查询中(即在数据库中)进行任何算术/过滤/分组,然后在服务器端进行“迭代”计算(例如在 PHP 中)。

于 2010-01-12T14:49:58.397 回答
1

您可以计算自午夜以来的分钟数,例如:

datepart(hh,datecolumn)*60 + datepart(mi,datecolumn)

如果将其除以 20,则得到 20 分钟间隔的数字。例如,00:10将落在区间000:30区间115:30区间46等中。使用此公式,您可以按 20 分钟的间隔进行分组,例如:

select
    (datepart(hh,datecolumn)*60 + datepart(mi,datecolumn)) / 20 as IntervalNr
,   avg(value)
from      YourTable
group by  (datepart(hh,datecolumn)*60 + datepart(mi,datecolumn)) / 20

您可以在avg通话中进行数学运算,例如:

avg(col1 * col2 - col3 / col4)
于 2010-01-12T14:54:29.833 回答
0

为了确定它是否会更快,应该对其进行测量。

但是它应该更快,因为您与数据库的连接速度很慢,这样往返次数对总执行时间的影响更大。

于 2010-01-12T14:54:48.620 回答
0

数据库上的存储过程怎么样?如果您的数据库引擎不支持,那么让脚本或其他东西进行数学运算并在您的数据库服务器上填充一个单独的“平均值”表怎么样。然后,您只需每天一次从远程客户端读取平均值。

于 2010-01-12T14:55:31.993 回答
0

单个查询中的计算会稍微快一些。想想多个请求的开销,比如建立连接、解析查询或加载存储过程等。

但也要确保你有准确的指标,这可能会导致性能大幅提升。对大型数据库的某些操作可能会持续几分钟到几小时。

于 2010-01-12T14:58:04.917 回答
0

如果您要发送大量数据,并且连接是瓶颈,那么分组和发送数据的方式和时间并不重要。没有好的方法可以通过 56k 调制解调器每 10 分钟发送 100MB。弄清楚你的数据和带宽的大小,并确保你甚至可以发送它。

那说:

首先确定网络是瓶颈。如果是这样,请尽可能尝试使用较小的数据集,并测试不同的场景。通常,1 个大型记录集使用的带宽少于 2 个一半大小的记录集。

于 2010-01-12T16:08:04.650 回答
0

如果可能,每次将数据发布到数据库时,将列添加到表中并计算和存储列积和区间索引(参见 Andomar 的帖子)。

于 2010-01-12T16:49:10.570 回答