diff options
Diffstat (limited to 'doc/src')
-rw-r--r-- | doc/src/sgml/plpgsql.sgml | 4 | ||||
-rw-r--r-- | doc/src/sgml/ref/prepare.sgml | 22 | ||||
-rw-r--r-- | doc/src/sgml/spi.sgml | 14 |
3 files changed, 39 insertions, 1 deletions
diff --git a/doc/src/sgml/plpgsql.sgml b/doc/src/sgml/plpgsql.sgml index 95cf4b6b467..b2091635313 100644 --- a/doc/src/sgml/plpgsql.sgml +++ b/doc/src/sgml/plpgsql.sgml @@ -4258,7 +4258,9 @@ $$ LANGUAGE plpgsql; on specific parameter values, and caching that for re-use. Typically this will happen only if the execution plan is not very sensitive to the values of the <application>PL/pgSQL</> variables referenced in it. - If it is, generating a plan each time is a net win. + If it is, generating a plan each time is a net win. See <xref + linkend="sql-prepare"> for more information about the behavior of + prepared statements. </para> <para> diff --git a/doc/src/sgml/ref/prepare.sgml b/doc/src/sgml/ref/prepare.sgml index 8466a63c580..b1698f2bb88 100644 --- a/doc/src/sgml/ref/prepare.sgml +++ b/doc/src/sgml/ref/prepare.sgml @@ -153,6 +153,28 @@ PREPARE <replaceable class="PARAMETER">name</replaceable> [ ( <replaceable class </para> <para> + Although the main point of a prepared statement is to avoid repeated parse + analysis and planning of the statement, <productname>PostgreSQL</> will + force re-analysis and re-planning of the statement before using it + whenever database objects used in the statement have undergone + definitional (DDL) changes since the previous use of the prepared + statement. Also, if the value of <xref linkend="guc-search-path"> changes + from one use to the next, the statement will be re-parsed using the new + <varname>search_path</>. (This latter behavior is new as of + <productname>PostgreSQL</productname> 9.3.) These rules make use of a + prepared statement semantically almost equivalent to re-submitting the + same query text over and over, but with a performance benefit if no object + definitions are changed, especially if the best plan remains the same + across uses. An example of a case where the semantic equivalence is not + perfect is that if the statement refers to a table by an unqualified name, + and then a new table of the same name is created in a schema appearing + earlier in the <varname>search_path</>, no automatic re-parse will occur + since no object used in the statement changed. However, if some other + change forces a re-parse, the new table will be referenced in subsequent + uses. + </para> + + <para> You can see all prepared statements available in the session by querying the <link linkend="view-pg-prepared-statements"><structname>pg_prepared_statements</structname></link> system view. diff --git a/doc/src/sgml/spi.sgml b/doc/src/sgml/spi.sgml index 13391689c70..68693667b66 100644 --- a/doc/src/sgml/spi.sgml +++ b/doc/src/sgml/spi.sgml @@ -976,6 +976,20 @@ SPIPlanPtr SPI_prepare(const char * <parameter>command</parameter>, int <paramet </para> <para> + Although the main point of a prepared statement is to avoid repeated parse + analysis and planning of the statement, <productname>PostgreSQL</> will + force re-analysis and re-planning of the statement before using it + whenever database objects used in the statement have undergone + definitional (DDL) changes since the previous use of the prepared + statement. Also, if the value of <xref linkend="guc-search-path"> changes + from one use to the next, the statement will be re-parsed using the new + <varname>search_path</>. (This latter behavior is new as of + <productname>PostgreSQL</productname> 9.3.) See <xref + linkend="sql-prepare"> for more information about the behavior of prepared + statements. + </para> + + <para> This function should only be called from a connected procedure. </para> |