Разходни параметри за планиране
Това ми казва, че вашата random_page_cost и seq_page_cost вероятно са грешни. Вероятно използвате хранилище с бърз произволен I/O - или защото по-голямата част от базата данни е кеширана в RAM, или защото използвате SSD, SAN с кеш или друго хранилище, където произволният I/O е присъщо бърз.
Опитайте:
SET random_page_cost = 1;
SET seq_page_cost = 1.1;
за значително намаляване на разликите в параметрите на разходите и след това стартирайте отново. Ако това върши работа, помислете за промяна на тези параметри в postgresql.conf. .
Вашите прогнози за броя на редовете са разумни, така че не изглежда като проблем с грешна оценка на плановика или проблем с лоша статистика на таблицата.
Неправилна заявка
Вашето запитване също е неправилно. OFFSET 0 LIMIT 1 без ORDER BY ще доведе до непредвидими резултати, освен ако не е гарантирано, че имате точно едно съвпадение, в който случай OFFSET ... LIMIT ... клаузите са ненужни и могат да бъдат премахнати изцяло.
Обикновено е много по-добре да формулирате такива заявки като SELECT max(...) или SELECT min(...) където е възможно; PostgreSQL ще има тенденция да може да използва индекс, за да извлече желаната стойност, без да прави скъпоструващо сканиране на таблица или сканиране на индекс и сортиране.
Съвети
Между другото, за бъдещи въпроси PostgreSQL wiki има добра информация в категория за производителност и ръководство за задаване на въпроси за бавни заявки .