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 にデータをコピーして集計する最も効率的な方法は何でしょうか?

私はすでにこの2つの方法を試みました。カーソルを使用すると、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

1日の終わりにGaugeSummaryDataを1回だけ更新する必要がありますか?そうでない場合は、おそらくゲージデータに挿入後トリガーを適用すると、プロセス全体がリアルタイムになり、時間がかからなくなります。Gauge Dataにエントリが作成されるとすぐに、トリガーはGaugeSummaryDataの対応するエントリを更新します。その日の最初のエントリの場合、トリガーは更新する前に1日の合計を0にリセットする必要があります。

于 2012-09-24T09:12:37.373 に答える