1

我们以 5 分钟的间隔存储大量仪表的数据读数。

涉及的数据表有:

Table1 - GaugeData
Columns - 
    GaugeID (int, primary key)
    Timestamp (datetime, primary key)
    Value (decimal)

Table2 - GaugeSummaryData
Columns - 
    GaugeID (int, primary key)
    DayTimestamp (date, primary key)
    DayTotal (decimal) - total for the current date/day
    CumulativeTotal (decimal) - total up to and including the current date

在不以任何方式更改表结构的情况下,将数据从 GaugeData 复制和聚合到 GaugeSummaryData 的最有效方法是什么?

我已经尝试过这两种方法。使用游标将所有数据从 GaugeData 复制到 GaugeSummaryData 需要 40 分钟。使用插入/更新语句需要 2 小时以上。

有人可以建议最有效的方法吗?伪代码或 SQL 赞赏。

4

2 回答 2

1

5GB 不是那么多数据。我会说你的表可以使用一些新的索引。一旦这些到位,插入触发器应该可以很好地完成这项工作。

CREATE TRIGGER trig_INS_GaugeData ON GaugeData FOR INSERT AFTER
AS
BEGIN
    -- create new GaugeSummaryData rows for dates that are not in table yet
    INSERT GaugeSummaryData (GaugeID, DayTimestamp, DayTotal, CumulativeTotal)
    SELECT I.GaugeID, CONVERT(date, I.TimeStamp), 0, SUM(GT.DayTotal)
    FROM INSERTED AS I
    INNER JOIN GaugeSummaryData GT ON I.GaugeID = GT.GaugeID AND convert(date, I.TimeStamp) < GT.DayTimestamp
    GROUP BY I.GaugeID, convert(date, I.TimeStamp)
    -- update GaugeSummaryData rows with totals
    UPDATE GSD
    SET DayTotal = DayTotal+I.Value, CumulativeTotal = CumulativeTotal + I.Value
    From INSERTED AS I
    INNER JOIN GaugeSummaryData GT ON I.GaugeID = GT.GaugeID
          and convert(date, I.TimeStamp) = GT.DayTimestamp
END
于 2012-09-24T14:04:26.360 回答
0

是否需要在每天结束时只更新一次 GaugeSummaryData?如果不是,那么可能在 Gauge Data 上应用插入后触发器应该使整个过程实时且耗时更少。只要在 Gauge Data 中创建条目,触发器就会更新 GaugeSummaryData 中的相应条目。如果它是当天的第一个条目,则触发器应在更新之前将 Day Total 重置为 0。

于 2012-09-24T09:12:37.373 回答