Запрос Postgres не использует индексы - PullRequest
0 голосов
/ 06 марта 2019

У меня есть таблица с 2000000 записями.У меня есть один индекс:

CREATE INDEX test
    ON public."PaymentReceipt" USING btree
    ("CompanyID" DESC NULLS LAST, created_at ASC NULLS LAST)
    TABLESPACE pg_default;

Если я выполню этот запрос, он запустит индекс:

explain 
select * 
from public."PaymentReceipt" 
where "CompanyID" = '5c67762bd0949' 
order by "created_at" desc 
limit 100 offset 1600589

Но если я выполню этот запрос, он не будет использовать индекс:

explain 
select * 
from public."PaymentReceipt" 
where "CompanyID" = '5c67762bd0949' 
order by "created_at" desc 
limit 100 offset 1600590

Я не уверен, что случилось с индексом!

1 Ответ

0 голосов
/ 06 марта 2019

OFFSET это плохо для производительности запроса .

Причина в том, что для пропуска первых 1000000 строк база данных должна найти, а затем отбросить их. Таким образом, работа с базой данных такая же, как если бы вы пропустили предложение OFFSET.

Теперь последовательное сканирование таблицы обходится дешевле, чем сканирование по индексу, поэтому последнее предлагает преимущество только в том случае, если количество извлеченных строк намного меньше, чем при последовательном сканировании. В какой-то момент план запроса будет & ldquo; tilt & rdquo; PostgreSQL будет считать, что сканирование индекса дешевле. Вы нашли именно эту точку.

Если настройка random_page_cost правильно отражает ваше оборудование, PostgreSQL оценит это правильно. Короче говоря, PostgreSQL делает правильные вещи.

...