Postgres ОБЪЯСНЯЕТ МЕДЛЕННЫЙ АНАЛИЗ времени планирования для первого запроса на соединение

#postgresql #postgresql-12

#postgresql #postgresql-12

Вопрос:

При первом запуске запроса psql он выполняется немного медленно. Во второй раз это намного быстрее, поскольку время планирования существенно сокращается.

 > EXPLAIN ANALYSE SELECT * FROM public.my_custom_function(10, 10, 'Personal');
 

В первый раз:

                                                                 QUERY PLAN                                                                 
--------------------------------------------------------------------------------------------------------------------------------------------
 Function Scan on my_custom_function  (cost=0.25..10.25 rows=1000 width=32) (actual time=4.900..4.901 rows=1 loops=1)
 Planning Time: 30.870 ms
 Execution Time: 3.410 ms
(3 rows)
 

Все последующие запросы:

                                                                 QUERY PLAN                                                                 
--------------------------------------------------------------------------------------------------------------------------------------------
 Function Scan on my_custom_function  (cost=0.25..10.25 rows=1000 width=32) (actual time=4.900..4.901 rows=1 loops=1)
 Planning Time: 0.620 ms
 Execution Time: 4.920 ms
(3 rows)
 

Это происходит каждый раз, когда я устанавливаю новое соединение с БД, первый вызов требует значительного времени планирования, а все остальные в порядке.

Дополнительный контекст

Развертывание: Docker

Версия Postgres: 12

Логика SQL: выполняет индексированные соединения и поиск ГДЕ. Я знаю, что логика там быстрая и надежная, и оптимизировать нужно не сам запрос.

Независимо от того, выполняю ли я запрос сам по себе или с помощью функции, остается та же проблема с временем планирования.

Проблема:

У меня есть HTTP API, устанавливающий соединение для каждого запроса, вызывающий функцию один раз, а затем возвращающий. Следовательно, каждый запрос API имеет производительность незапланированного запроса.

Вопрос:

Как я могу сделать так, чтобы этот запрос планировался один раз и никогда больше? Может быть, с помощью инструкции PREPARE?

Комментарии:

1. Просто игнорируйте первый раз. Ваш серверный процесс, вероятно, заменен или находится в виртуальной машине. КСТАТИ: 4 мсек — это не медленно. О, и что же my_custom_function() делать?

2. Если это только в первый раз, это также может быть вызвано кешем метаданных, который необходимо загрузить. В вашей базе данных много таблиц и / или схем?

3. Если проблема связана с вашей пользовательской функцией, вам нужно показать ее нам (в какой-то упрощенной форме, в которой все еще есть проблема). И если это не так, то вы должны показать нам менее специфичный пример.

4. Кроме того, какова операционная система и ваша версия PostgreSQL?

5. Привет всем, я обновил свой вопрос информацией, которую вы просили

Ответ №1:

Хотя могут быть способы ускорить это (если бы мы могли видеть вашу функцию), в основном, если вы очень чувствительны к производительности, вам нужно выбрать какую-либо технологию, которая не устанавливает одно соединение на запрос. Например, mod_perl или FastCGI или, может быть, pgbouncer.

Комментарии:

1. Итак, я проверил вашу теорию, и вы правы! Я собираюсь дать ему еще неделю, чтобы просто подождать и посмотреть, есть ли реальный способ сделать это в Postgres. Если ничего не появится, я отмечу это как ответ