172 похожих чатов

Всем привет! EXPLAIN SELECT "idx" FROM "geometries" WHERE "geometry" && ST_GeomFromText('POLYGON

(...)', 4326) ORDER BY "idx" DESC LIMIT 100;

Limit (cost=0.57..324664.77 rows=100 width=8)
-> Index Scan Backward using geometries_pkey on geometries (cost=0.57..591612854.78 rows=182223 width=8)
Filter: (geom && '0103000020E6100000010000000500000040C0AA1AE65BF2BF6FABA2F85DB7454040C0AA1AE65BF2BF647D72A327404640AC433F9B2A31EB3F647D72A327404640AC433F9B2A31EB3F6FABA2F85DB7454040C0AA1AE65BF2BF6FABA2F85DB74540'::geometry)
Вот такой запрос вместо индекса по геометрии берет индекс по pk, но в виду наличия фильтра видимо превращается в полный скан таблицы (работает очень медленно). Правильно было бы убрать просто ORDER BY чтобы использовался индекс по геометрии, но сам запрос формируется geoserver-ом и поправить его нельзя. Можно ли как-то зафорсить postgres-у юзать индекс по геометрии?

16 ответов

31 просмотр

Для начала — проверьте, что дело в order by , и без него (и, отдельно, без лимита ) запрос отработает по индэксу. Ну, и https://t.me/pgsql/303899

Хм. Теперь понятно. Да, опять дурацкая ситуацыя — планировщик считает данные некореллированными, а реально они там все в концэ индэкса лежат. А нельзя заставить там limit=500 сказать этому приложэнию? Ну, если нет — то можно опустить (втрое-вчетверо) оба page_cost: и seq и random. Тожэ должно проломить дурака.

Alexander-Verbitsky Автор вопроса

А, кстати, банальный вопрос — а параметры сервера из какого-нибудь конфигуратора типа cybertec применили? А то вдруг у вас там random_page_cost=4 на ssd...

Alexander-Verbitsky Автор вопроса
Ilya Anfimov
А, кстати, банальный вопрос — а параметры сервера ...

Нет не в курсе про cybertec - надо глянуть что это такое. Вполне возможно

Alexander-Verbitsky Автор вопроса
Ilya Anfimov
Два вопроса: там SSD? И show random_page_cost;

Amazon gp2, да под капотом SSD и random_page_cost именно 4 сейчас выставлен

Alexander-Verbitsky Автор вопроса
Ilya Anfimov
Два вопроса: там SSD? И show random_page_cost;

EXPLAIN (ANALYZE, BUFFERS) SELECT "idx" FROM "public"."geometries" WHERE "geometry" && ST_GeomFromText('POLYGON ((-1.147436241310075 43.4325552744184, -1.147436241310075 44.5012096699745 4, 0.8497517616434513 44.50120966997454, 0.8497517616434513 43.4325552744184, -1.147436241310075 43.4325552744184))', 4326) ORDER BY "idx" DESC LIMIT 500; Limit (cost=964870.82..964872.07 rows=500 width=8) (actual time=481.608..482.641 rows=500 loops=1) Buffers: shared hit=9851 read=27246 -> Sort (cost=964870.82..965464.26 rows=237376 width=8) (actual time=481.604..481.971 rows=500 loops=1) Sort Key: idx DESC Sort Method: top-N heapsort Memory: 60kB Buffers: shared hit=9851 read=27246 -> Index Scan using geometries_geom_idx on geometries (cost=0.55..953042.63 rows=237376 width=8) (actual time=0.343..325.720 rows=165633 loops=1) Index Cond: (geometry && '0103000020E6100000010000000500000040C0AA1AE65BF2BF6FABA2F85DB7454040C0AA1AE65BF2BF647D72A327404640AC433F9B2A31EB3F647D72A327404640AC433F9B2A31EB3F6FABA2F85DB7454040C0AA1AE 65BF2BF6FABA2F85DB74540'::geometry) Buffers: shared hit=9851 read=27246 Planning Time: 0.348 ms Execution Time: 483.017 ms (11 rows) увеличение лимита реально помогло

Alexander Verbitsky
Amazon gp2, да под капотом SSD и random_page_cost ...

Тогда банально настройте сервер по рекомендацыям — всё станет заметно легче. В частности, вероятно именно эта проблема уйдёт. Но, кстати, если вы в начале пути — то самое время поставить 14.2

Alexander-Verbitsky Автор вопроса
Ilya Anfimov
Тогда банально настройте сервер по рекомендацыям —...

Спасибо большое! Планируем в RDS все перенести. А что за рекомендации имеется в виду?

Alexander Verbitsky
Amazon gp2, да под капотом SSD и random_page_cost ...

gp2 вас покусает тем что в один прекрасный день вы не сможете снять бекап, посмотрите как минимум на io1

Alexander-Verbitsky Автор вопроса
Darafei Praliaskouski
gp2 вас покусает тем что в один прекрасный день вы...

Не знал, спасибо буду иметь в виду. Хотя тут не сильно критично ибо исходные данные у нас в gpkg лежат и всегда можно из них восстановиться.

Alexander Verbitsky
Спасибо большое! Планируем в RDS все перенести. А ...

Имелось в виду — настройки вроде http://pgconfigurator.cybertec.at/ или какого другого вменяемого конфигуратора. Там из действительно важных — shared_buffers, random_page_cost, что-то про workers и effective_cash_size. Немного. Но полезно. Да и остальные оттуда невредно.

Alexander-Verbitsky Автор вопроса
Alexander-Verbitsky Автор вопроса
Ilya Anfimov
Имелось в виду — настройки вроде http://pgconfigur...

Поднятие limit-а не для всех запросов помогает надо сказать.

Alexander Verbitsky
Поднятие limit-а не для всех запросов помогает над...

Отправляйте анализ запросов, будем думать. Но сначала — конфигуратор. Собственно, можэте попробовать set random_page_cost=1 — для этого запроса ужэ должно сработать.

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
Карта сайта