1

私のテーブルには次のフィールドがあります。

SENSOR_ID INTEGER, 
SENSOR_READING REAL, 
TIME_OF_READING TIMESTAMP, 
HASCHANGED BOOLEAN

各センサーは、1 日あたり 10,000 回以上の読み取りを実行します。SENSOR_READING が最後にログに記録された値と異なるデータポイントのみをログに記録したいと考えています。

または、すべてをログに記録することもできますが、SENSOR_READING が最後にログに記録された値と異なる場合は常に HASCHANGED を true に設定します。

それを達成するための最もパフォーマンスの高い構文は何ですか (PostgreSQL を使用し、php ロジックなしで)?

4

3 に答える 3

2

センサーとその現在の読み取り値を含むテーブルが必要でありUPDATE、センサー イベントにはそれがあります。次に、新しい読み取り値が異なる場合は、トリガーを使用してログ テーブルに書き込みます。

于 2012-06-11T12:02:32.000 に答える
1

あなたはこのようなことをすることができます

insert into readings (sensor_id, sensor_reading, time_of_reading)
select 42, 1234.5678, current_timestamp
from readings
where not exists (select * 
                  from readings 
                  where sensor_reading = 1234.5678
                    and time_of_reading = (select max(time_of_reading)
                                           from readings
                                           where sensor_id = 42);

これにはsensor_reading列にインデックスを付ける必要がありますが、実際に高速になるかどうかはまだ疑問です。

haschangedデータの取得中に計算できるため、属性を保存する必要はありません。

select sensor_id,
       sensor_reading,
       time_of_reading,
       lag(sensor_reading) over (partition by sensor_id order by time_of_reading) = sensor_reading as has_changed
from readings;

これは、それが実際には一意ではないことを前提としてsensor_idいます。そうでなければ、センサーの複数の読み取り値を保存できませんでした

さらに、使用する値が正確ではないため、そのREAL列を列に変更することを前提としています(実際には、最初から格納が正確ではありません)。NUMERICREAL=

于 2012-06-11T12:04:25.740 に答える
1

最後の値を配置する列を追加する必要があると思います。その後、「読み取り」ごとに、これら2つの列を比較できます。

これは「純粋なSQL」アプローチですが、コールバックのようなより良い解決策があります(あなたはphpについて話しましたので、symfonyとdoctrineがあなたのためにそれを行うことができることをお勧めします。値が変更されるか、このようなものです...)

于 2012-06-11T11:57:41.853 に答える