Подготовленные операторы
PREPARE EXECUTE и DEALLOCATE
PREPARE - подготавливает оператор к выполнению, что позволяет оптимизировать производительность приложения.
EXECUTE выполняет подготовленный ранее оператор, который будет существовать в рамках текущего сеанса
Если команда PREPARE, создающая оператор, определяет некоторый набор параметров, команде EXECUTE должны быть переданы подходящие значения этих параметров
С помощью PREPARE оператор разбирается, анализируется и переписывается. При выполнении команды EXECUTE подготовленный оператор планируется и исполняется, что исключает повторный разбор запроса и позволяет выбрать наилучший план выполнения
Подготовленные операторы могут принимать параметры, значения которых подставляются в оператор при его выполнении, к этим параметрам можно обращаться по порядковому номеру, используя запись $1, $2 и т. д.
Освободить подготовленный оператор можно вручную, выполнив команду DEALLOCATE
Отличие в производительности значительно, если операторы достаточно сложны для планирования или перезаписи, когда в запросе объединяется множество таблиц
DEALLOCATE - с помощью данной команды можно освободить подготовленные операторы
Если у запроса нет параметров, при подготовке запоминается и построенный план выполнения. Если же параметры есть, то их фактические значения принимаются во внимание при планировании. Планировщик может посчитать, что план, построенный без учета параметров, окажется не хуже, и тогда перестанет выполнять планирование повторно.
Источник: https://postgrespro.ru/docs/postgresql/13/sql-prepare
--Подготовленный оператор INSERT и его выполнение
testdb=# PREPARE testplan(int, text) AS INSERT INTO test_table VALUES ($1, $2);
PREPARE
testdb=# EXECUTE testplan (4, 'Ivan');
INSERT 0 1
testdb=#
testdb=# EXECUTE testplan (4, 'Ivan');
INSERT 0 1
testdb=#
testdb=# EXECUTE testplan (4, 'Egor');
INSERT 0 1
testdb=#
testdb=# SELECT * FROM test_table ;
id | name
----+-------
1 | test
2 | test1
4 | test3
4 | Ivan
4 | Ivan
4 | Egor
(6 rows)
--Подготовленный оператор SELECT и его выполнение
testdb=#
testdb=# PREPARE testselect AS SELECT * FROM test_table ;
PREPARE
testdb=# EXECUTE testselect ;
id | name
----+-------
1 | test
2 | test1
4 | test3
4 | Ivan
4 | Ivan
4 | Egor
(6 rows)
testdb=#
--Все подготовленные операторы можно увидеть в представлении
testdb=# SELECT * FROM pg_prepared_statements \gx
-[ RECORD 1 ]---+-----------------------------------------------------------------------
name | testplan
statement | PREPARE testplan(int, text) AS INSERT INTO test_table VALUES ($1, $2);
prepare_time | 2024-03-27 19:40:00.362857+03
parameter_types | {integer,text}
from_sql | t
generic_plans | 0
custom_plans | 3
-[ RECORD 2 ]---+-----------------------------------------------------------------------
name | testselect
statement | PREPARE testselect AS SELECT * FROM test_table ;
prepare_time | 2024-03-27 19:46:43.799834+03
parameter_types | {}
from_sql | t
generic_plans | 1
custom_plans | 0
testdb=#
Источники
Связанные темы
Оптимизация запросов в Postgresql
Установка и настройка MS SQL Server 2008 на Windows Server 2008 r
Системный каталог в Postgresql
Табличные пространства в Postgresql
Определение данных в Postgresql
Изменение временной зоны в Postgresql
Основные команды psql и sql Postgresql
Методы формирования соединений наборов строк
Агрегирование и группировка в Postgresql