Sql 在计算列上的运行平均值/统计信息时避免循环

Sql 在计算列上的运行平均值/统计信息时避免循环,sql,performance,postgresql,loops,Sql,Performance,Postgresql,Loops,我想加快下面的PostgreSQL代码的速度,我推测它将有助于消除一些循环,但我没有看到一种方法可以做到这一点。欢迎任何关于加速的建议。提前谢谢 该代码计算不同部分每列的一些统计平均值、斜率。该部分由滑动时间窗口(比如60分钟)确定。下面的代码 循环遍历我感兴趣的不同列,计算它们的统计信息 对于每一列,我依次移动我的时间窗口并计算该窗口中值的统计信息。 引入了临时存储结果的小_表,以避免对大_表进行多次更新 小表和大表的结构相同,但小表的行数要少得多。 这两个表的列是 时间|场1 |场2 |场

我想加快下面的PostgreSQL代码的速度,我推测它将有助于消除一些循环,但我没有看到一种方法可以做到这一点。欢迎任何关于加速的建议。提前谢谢

该代码计算不同部分每列的一些统计平均值、斜率。该部分由滑动时间窗口(比如60分钟)确定。下面的代码

循环遍历我感兴趣的不同列,计算它们的统计信息 对于每一列,我依次移动我的时间窗口并计算该窗口中值的统计信息。

引入了临时存储结果的小_表,以避免对大_表进行多次更新

小表和大表的结构相同,但小表的行数要少得多。 这两个表的列是 时间|场1 |场2 |场1 |斜率|场1 |均值|场2 |斜率|场2 |均值


实际上有相当多的列~50,这可能是另一个减速因素?

如果动态生成以下SQL模式,至少可以在一个查询中执行所有这些操作。我不确定它是否会表现得更好,尽管很明显,您需要遍历所有列并将它们添加到中。在我担心在代码中构建SQL之前,我会先测试性能

Update
    big_table b
Set
    field1_slope = x.field1_slope,
    field1_mean = x.field1_mean,
    field2_slope = x.field2_slope,
    field2_mean = x.field2_mean
From (
    Select
        b1.time,
        regr_slope(b2.field1, b2.time) field1_slope,
        avg(b2.field1) field1_mean,
        regr_slope(b2.field2, b2.time) field2_slope,
        avg(b2.field2) field2_mean
    From
        big_table b1
            Inner Join
        big_table b2
            On b2.time >= b1.time and b2.time < b1.time + 60
    Group By
        b1.time
    ) x
Where
    b.time = x.time;
我对PostgreSQL不太熟悉,可能有一种方法可以消除对大表的引用


大表在时间列上有索引吗?有。感谢您的澄清。数据点之间有固定的时间间隔,还是随机的?时间间隔是随机的。这非常有效-内部联接、分组方式和显式赋值的组合。非常感谢。
Update
    big_table b
Set
    field1_slope = x.field1_slope,
    field1_mean = x.field1_mean,
    field2_slope = x.field2_slope,
    field2_mean = x.field2_mean
From (
    Select
        b1.time,
        regr_slope(b2.field1, b2.time) field1_slope,
        avg(b2.field1) field1_mean,
        regr_slope(b2.field2, b2.time) field2_slope,
        avg(b2.field2) field2_mean
    From
        big_table b1
            Inner Join
        big_table b2
            On b2.time >= b1.time and b2.time < b1.time + 60
    Group By
        b1.time
    ) x
Where
    b.time = x.time;