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