以下はpostgresqlの私のテーブルです。
CREATE TABLE public.member_profile_events (
id bigserial PRIMARY KEY,
profileid varchar(80) NOT NULL,
data jsonb,
last_updated_at TIMESTAMP WITHOUT TIME ZONE NOT NULL DEFAULT now(),
UNIQUE (profileid)
);
CREATE INDEX member_profile_events_last_updated_at ON public.member_profile_events USING (last_updated_at);
すべての挿入と更新で last_updated_at = now() を更新しています。
以下の upsert クエリを使用して、「profile1」、「profile2」などのランダムな行を最大 350000 行アップサートしました。
INSERT INTO public.member_profile_events as e (profileid, data, last_updated_at)
values (
'profile1',
'{"group1": {"score": 1,"recorddate": "2018-02-01 13:15:00"}}',
now()
)
ON CONFLICT (profileid)
DO UPDATE SET data = '{"group1": {"score": 1,"recorddate": "2018-02-01 13:15:00","updated":"true"}}',
last_updated_at = now();
しかし、以下のクエリを実行した後:
explain analyze select * from member_profile_events where last_updated_at = '2018-04-11 12:49:35'::timestamp;
postgres が last_updated_at 列のインデックスを使用していないことがわかりました。以下は出力です:
Seq Scan on member_profile_events (cost=0.00..570.65 rows=1 width=130) (actual time=8.490..8.490 rows=0 loops=1)
Filter: (last_updated_at = '2018-04-11 12:49:35'::timestamp without time zone)
Rows Removed by Filter: 17963
Planning time: 0.282 ms
Execution time: 8.685 ms
誰かがここで何がうまくいかないのか教えてください..なぜpostgresはlast_updated_atフィールドでインデックスを使用していないのですか??