Планы Postgres Explain отличаются для одного и того же запроса с другим параметром - PullRequest
0 голосов
/ 02 октября 2019

Я не знаю, почему запрос explain дает разные результаты, когда я запускаю следующий запрос с различными значениями параметров sender_id = 2015 против sender_id = 2016:

  • С sender_id = 2015:
EXPLAIN SELECT
    *
FROM
    shipment.shipments shipment0_
WHERE
    (shipment0_.status IN (0 ,1 ,2))
    AND shipment0_.sender_id = 2015
ORDER by shipment0_.id DESC
LIMIT 10;
Limit  (cost=0.43..4.92 rows=10 width=11006)
  ->  Index Scan Backward using shipments__id_pk on shipments shipment0_  (cost=0.43..446315.18 rows=993372 width=11006)
        Filter: ((sender_id = 2015) AND (status = ANY ('{0,1,2}'::bigint[])))
  • С sender_id = 2016:
EXPLAIN SELECT
    *
FROM
    shipment.shipments shipment0_
WHERE
    (shipment0_.status IN (0 ,1 ,2))
    AND shipment0_.sender_id = 2016
ORDER by shipment0_.id DESC
LIMIT 10;
Limit  (cost=0.43..16.33 rows=10 width=11006)
  ->  Index Scan using idx_sender_id_id on shipments shipment0_  (cost=0.43..155621.11 rows=97858 width=11006)
        Index Cond: (sender_id = 2016)
        Filter: (status = ANY ('{0,1,2}'::bigint[]))

В shipment.shipments таблица содержит 1М записей с sender_id = 2015:

select count(*) from shipment.shipments where sender_id = 2015; -- 1000000 records
select count(*) from shipment.shipments where sender_id = 2016; -- 90000 records

Вот DDL таблицы shipment.shipments:

CREATE TABLE shipment.shipments (
    id bigserial NOT NULL,
    shp_date varchar(50) NULL,
    shp_time varchar(50) NULL,
    sender_id int8 NULL,
    status int8 NULL,
    pickup_order_id int8 NULL,
    CONSTRAINT shipments__id_pk PRIMARY KEY (id),
    CONSTRAINT shipments__pickup_orders_id_fk FOREIGN KEY (pickup_order_id) REFERENCES shipment.pickup_orders(id)
);
CREATE INDEX idx_sender_id_id ON shipment.shipments USING btree (sender_id, id DESC);
CREATE INDEX shipments__sender_id_idx ON shipment.shipments USING btree (sender_id);

Запрос с sender_id = 2016 выполняется очень быстро с order by limit, но с sender_id = 2015 он очень медленный и неиспользуйте индекс idx_sender_id_id. Не могли бы вы помочь мне объяснить это? и как повысить скорость запроса с помощью sender_id = 2015. Большое вам спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...