私はこれのようなものを持っています。コードのこの部分では、車両が少なくとも5分間停止したかどうかを検出します。 それは動作しますが、大量のデータでは遅くなります。 私は多くのテストを行い、私の問題はnot exists
ブロックにあると確信しています。PostgreSQL - 現在のレコード日付と同じ日付に5分を加えたレコードで条件を作成する方法は?
マイテーブル:
CREATE TABLE public.messages
(
id bigint PRIMARY KEY DEFAULT nextval('messages_id_seq'::regclass),
messagedate timestamp with time zone NOT NULL,
vehicleid integer NOT NULL,
driverid integer NOT NULL,
speedeffective double precision NOT NULL,
-- ... few nonsense properties
)
WITH (
OIDS=FALSE
);
ALTER TABLE public.messages OWNER TO postgres;
CREATE INDEX idx_messages_1 ON public.messages
USING btree (vehicleid, messagedate);
そして、私のクエリ:
SELECT
*
FROM
messages m
WHERE
m.speedeffective > 0
and m.next_speedeffective = 0
and not exists(-- my problem
select id
from messages
where
vehicleid = m.vehicleid
and speedeffective > 5 -- I forgot this condition
and messagedate > m.messagedate
and messagedate <= m.messagedate + interval '5 minutes'
)
私は、よりパフォーマンスの高い方法で、条件を構築する方法を見つけ出すことはできません。
編集DAY2:
私は二のテーブルで使用するには、このような前の表を追加しました:
WITH messagesx as (
SELECT
vehicleid,
messagedate
FROM
messages
WHERE
speedeffective > 5
)
、今は良い作品。私は少し詳しくは分からないと思う。
おそらく私はあなたの質問に答えることはできませんが、定義されたインデックスと一緒にテーブルのDDLを投稿する必要があります – fero
ありがとう@fero。何か追加するには? – Gohchi