私のIoTユースケースでは、センサーの読み取り値を格納するテーブルがあります。 timescaledb拡張子を使用しています。
次のテーブル定義があります。
CREATE TABLE readings (
id BIGSERIAL PRIMARY KEY,
time TIMESTAMPTZ NOT NULL,
value DOUBLE PRECISION NOT NULL,
device VARCHAR(255) NOT NULL,
sensor VARCHAR(255) NOT NULL,
resolution VARCHAR(255) NOT NULL,
UNIQUE(time, device, sensor, resolution)
);
欲しい最後に報告された時間すべての(device,sensor)
ペア。これが私が実行しているクエリです:
select MAX(time), device, sensor from readings group by device, sensor
このクエリは、完了するまでにかなりの時間がかかります。パフォーマンスを向上させる方法はありますか?または、同じ結果を達成するためのより良いクエリはありますか?
私はこれをやってみましたが、役に立ちませんでした:
create index if not exists readings_idx on readings (time, device, sensor, resolution);
(ここでタイムスケールの共同創設者)
「ラストポイント」クエリを実行しようとしているようです。たとえば、各(デバイス、センサー)から送信された最新のレコードを検索します。上記のクエリの課題は、データベースが最後のデバイス/センサーをいつ見つけたかわからないため、時間の開始までスキャンして、新しいデバイスがないと結論付ける必要があることです。
時系列レコードに対してデバイスのリストからLATERALSCANを実行する、次のアプローチの方がはるかに優れています。
https://docs.timescale.com/latest/using-timescaledb/reading-data#last-point
幸運を祈ります。Slackグループは https://slack.timescale.com これらのタイプの質問に役立ちます。