#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. Если ничего не появится, я отмечу это как ответ