Я пытаюсь оптимизировать запросы из моего бэкэнда fastify(node), используя модуль auto_explain
, предоставляемый PostgreSQL 10. Однако для запросов, поступающих через мою службу, не создается никакой информации о запросах, несмотря на то, что они просматриваются в журналах.
Я включил модуль, выполнив в своем контейнере следующие команды psql:
LOAD 'auto_explain';
SET auto_explain.log_min_duration=0;
SET auto_explain.log_analyze=true;
SET auto_explain.log_verbose = true;
SET auto_explain.log_nested_statements = true;
Я также установил log_statement = 'all'
в postgresql.conf
.
Кажется, это работает, потому что если я запущу простой выбор через psql, я увижу что-то похожее на:
postgresql-1 | 2024-04-26 22:21:54.630 UTC [384] LOG: statement: select * from user;
postgresql-1 | 2024-04-26 22:21:54.631 UTC [384] LOG: duration: 0.200 ms plan:
postgresql-1 | Query Text: select * from user;
postgresql-1 | Seq Scan on user (cost=0.00..1.03 rows=3 width=1367) (actual time=0.016..0.022 rows=3 loops=1)
postgresql-1 | Output: (a bunch of columns...)
Однако я не получаю никакой информации о плане, когда запускаю запрос от своей серверной службы (с использованием node-postgres
и @types/pg
). Я вижу запись LOG: execute <unnamed>:
, показывающую мой параметризованный запрос, и запись DETAILS
, показывающую параметры с их значениями для запроса.
Буду признателен за любую информацию о правильном включении этого модуля для моих запросов.
То, что вы показываете, - это настройка только на один сеанс.
Чтобы активировать его для всех, вам следует настроить его в файле postgresql.conf, как вы это сделали для log_statement. Для этого вы помещаете имя расширения в файлshared_preload_libraries (вместо использования команды LOAD), а остальные параметры устанавливаете обычным способом для postgresql.conf.
Спасибо за предложение, оно было в точку.