我有一个包含每0.1秒收集一次记录的数据库,我需要将给定日期的数据时间平均为每20分钟一次。因此,我需要每20分钟返回一天的平均数据,即24 * 3值 目前,我在一天内每20分钟对数据库进行一次单独的AVG呼叫,即24 * 3呼叫。我与数据库的连接似乎有点慢(它是远程的)并且需要大约5分钟来完成所有平均值。单一查询可以更快地访问整天的数据,然后平均每20分钟一次吗?如果它有助于回答这个问题,我必须在平均之前对数据进行一些算术运算,即乘以几个表列。
答案 0 :(得分:1)
一般来说,减少查询次数是个好主意。在查询中(即在数据库中)聚合并执行任何算术/过滤/分组,然后在服务器端执行'迭代'计算(例如在PHP中)。
答案 1 :(得分:1)
您可以计算自午夜以来的分钟数:
datepart(hh,datecolumn)*60 + datepart(mi,datecolumn)
如果将其除以20,则得到20分钟间隔的数字。例如,00:10
将位于区间0
,区间00:30
中的1
和区间15: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)
答案 2 :(得分:0)
为了确定它是否会更快,应该进行测量。
但是它应该更快,因为您与数据库的连接速度很慢,这样往返次数对总执行时间的影响就会更大。
答案 3 :(得分:0)
数据库上的存储过程怎么样?如果您的数据库引擎不支持,那么如何使用脚本或某些东西进行数学运算并在数据库服务器上填充单独的“averages”表。然后,您只需每天一次从远程客户端读取平均值。
答案 4 :(得分:0)
单个查询中的计算会稍快一些。考虑多个请求的开销,例如设置连接,解析查询或加载存储过程等等。
但也请确保您有准确的指标,这可能会导致性能提升。对休数据库的一些操作可能持续几分钟到几小时。
答案 5 :(得分:0)
如果要发送大量数据,并且连接是瓶颈,则分组和发送数据的方式和时间无关紧要。没有好的方法可以通过56k调制解调器每10分钟发送100MB。弄清楚数据和带宽的大小,确保你甚至可以发送它。
那说:
首先要确定网络是瓶颈。如果是这样,尽可能尝试使用较小的数据集,并测试不同的方案。通常,1个大记录集将使用比2个大小一半的记录集更少的带宽。
答案 6 :(得分:0)
如果可能的话,每次向数据库发布数据时,都会向表中添加列并计算和存储列产品和间隔索引(请参阅Andomar的帖子)。