Причина часто не в данных и не в железе. Планировщик может недооценить кардинальность и стоимость шагов, выбрать слишком дешевый для себя план, а в реальности получить Nested Loop там, где выгоднее Hash Join, или Seq Scan вместо Index Scan. Бывает и так, что дерево запроса устроено неудачно: нужные условия спрятаны, и часть эффективных алгоритмов просто не рассматривается. Эти случаи закрывает расширение pgpro_planner. Оно переписывает неудобные для оптимизатора куски дерева запроса в более дружелюбный вид еще до того, как основной планировщик выберет план. Ниже — три примера небольших оптимизаций с большим эффектом. ✔️ IN (VALUES ...) → = ANY(array) В одном запросе из мира 1С фильтры были оформлены как IN (VALUES ...) для numeric и bytea. До обновления статистики он работал быстрее 1 мс, после — около 7,5 с. В плане львиная доля времени ушла в Nested Loop Semi Join и материализацию маленьких таблиц из VALUES. Индекс почти не помогал, потому что сравнение было внутри join-фильтр
Иногда один и тот же запрос внезапно раздувается по времени: с долей миллисекунды до минут и даже часов
4 марта4 мар
1
1 мин