Эрвин прибивает это, но позвольте мне добавить, что расширенный протокол запросов позволяет вам использовать больше вариантов готовых операторов.Помимо избежания повторного разбора и перепланирования, одним большим преимуществом подготовленных операторов является отдельная отправка значений параметров, что позволяет избежать экранирования и анализа накладных расходов, не говоря уже о возможности SQL-инъекций и ошибок, если вы не используете API, который обрабатываетпараметры таким образом, что вы не можете забыть избежать их.
http://www.postgresql.org/docs/9.1/static/protocol-flow.html
Планирование запроса для именованных объектов подготовленного оператора происходит при обработке сообщения Parse.Если запрос будет неоднократно выполняться с различными параметрами, может быть полезно отправить одно сообщение Parse, содержащее параметризованный запрос, за которым следуют несколько сообщений Bind и Execute.Это позволит избежать повторного планирования запроса при каждом выполнении.
Неименованный подготовленный оператор также планируется во время обработки анализа, если сообщение Parse не определяет параметры.Но если есть параметры, планирование запросов происходит каждый раз, когда предоставляются параметры Bind.Это позволяет планировщику использовать фактические значения параметров, предоставляемых каждым сообщением Bind, а не использовать общие оценки.
Таким образом, если ваш интерфейс БД поддерживает это, вы можете использовать безымянные подготовленные операторы,Это что-то среднее между запросом и обычным подготовленным оператором.
Если вы используете PHP с PDO, обратите внимание, что реализация подготовленного оператора PDO довольно бесполезна для postgres, поскольку она использует именованные подготовленные операторы, ноповторная подготовка каждый раз, когда вы вызываете метод prepare (), кэширование плана не выполняется.Таким образом, вы получаете худшее из обоих: много поездок туда и обратно и план без параметров.Я видел, что это в 1000 раз медленнее, чем pg_query () и pg_query_params () в определенных запросах, где оптимизатору postgres действительно нужно знать параметры, чтобы получить оптимальный план.pg_query использует необработанные запросы, pg_query_params использует безымянные подготовленные операторы.Обычно один быстрее другого, это зависит от размера данных параметра.