【问题标题】:Speeding up database access加快数据库访问
【发布时间】:2010-01-12 14:43:26
【问题描述】:

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

【问题讨论】:

  • 您当前的查询和表定义会很好。

标签: sql-server average


【解决方案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)

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            【解决方案6】:

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

            也就是说:

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

            【讨论】:

              【解决方案7】:

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

              【讨论】:

                猜你喜欢
                • 2015-11-12
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2012-04-28
                • 2010-09-05
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多