0

以下は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フィールドでインデックスを使用していないのですか??

4

0 に答える 0