Я не знаю, почему запрос explain
дает разные результаты, когда я запускаю следующий запрос с различными значениями параметров sender_id = 2015
против sender_id = 2016
:
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[])))
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
. Большое вам спасибо!