レコードを検索し、一定時間後に別のレコードを検索するクエリを実行しています。
テーブル定義:
(
id integer primary key,
gpsstatus character(2),
datetime timestamp without time zone,
lat numeric(9,6),
lon numeric(9,6),
alt numeric(9,4),
time integer,
datafileid integer,
shape geometry,
speed double precision,
dist double precision,
shape_utm geometry,
lokalitet character(128),
cowid integer
)
datetime、lokalitet、cowid、gpsstatus、gist-indexにはshapeとshape_utmのインデックスがあります。
ポイントは5秒ごとにサンプリングする必要があるので、やってみました
select <something more>,p1.timestamp
from table p1, table p2
where p1.timestamp + interval '5 secound' = p2.timestamp
それはかなり速く実行されましたが、サンプリングのジッターのためにかなりの数のポイントが失われたことがわかりました。そのため、ポイントは4〜6秒離れている可能性があります。
それから私は試しました:
where (p2.timestamp, interval'0 second')
overlaps (p1.timestamp + interval '4 second', interval '2 second')
そしてそれは何年もかかりました。私はまた、より簡単な解決策を試しました:
WHERE p1.timestamp + interval '4 second' <= p2.timestamp
AND p1.timestamp + interval '6 second' >= p2.timestamp
これもまた、使用できないほど遅くなってしまいました。
タイムスタンプフィールドには通常のインデックスがあります。このクエリを使用可能にする特別な種類のインデックスはありますか?
現時点でのクエリ:
SELECT
p1.cowid,
p1.datetime,
st_distance(p1.shape_utm, lead(p1.shape_utm)
OVER (ORDER BY p1.datetime)) AS meters_obs,
st_distance(p1.shape_utm, lead(p1.shape_utm, 720)
OVER (ORDER BY p1.datetime)) AS meters_hour,
observation.observation
FROM (gpspoint p1 LEFT JOIN observation
ON (observation.gpspointid = p1.id)),
status
WHERE p1.gpsstatus = status.id
AND status.use = true;
また、特定の間隔を要求することで、許容可能なクエリ時間を取得できる場合があります。