]> granicus.if.org Git - postgresql/blob - doc/src/sgml/ref/prepare.sgml
Trim trailing whitespace
[postgresql] / doc / src / sgml / ref / prepare.sgml
1 <!--
2 doc/src/sgml/ref/prepare.sgml
3 PostgreSQL documentation
4 -->
5
6 <refentry id="SQL-PREPARE">
7  <indexterm zone="sql-prepare">
8   <primary>PREPARE</primary>
9  </indexterm>
10
11  <indexterm zone="sql-prepare">
12   <primary>prepared statements</primary>
13   <secondary>creating</secondary>
14  </indexterm>
15
16  <refmeta>
17   <refentrytitle>PREPARE</refentrytitle>
18   <manvolnum>7</manvolnum>
19   <refmiscinfo>SQL - Language Statements</refmiscinfo>
20  </refmeta>
21
22  <refnamediv>
23   <refname>PREPARE</refname>
24   <refpurpose>prepare a statement for execution</refpurpose>
25  </refnamediv>
26
27  <refsynopsisdiv>
28 <synopsis>
29 PREPARE <replaceable class="PARAMETER">name</replaceable> [ ( <replaceable class="PARAMETER">data_type</replaceable> [, ...] ) ] AS <replaceable class="PARAMETER">statement</replaceable>
30 </synopsis>
31  </refsynopsisdiv>
32
33  <refsect1>
34   <title>Description</title>
35
36   <para>
37    <command>PREPARE</command> creates a prepared statement. A prepared
38    statement is a server-side object that can be used to optimize
39    performance. When the <command>PREPARE</command> statement is
40    executed, the specified statement is parsed, analyzed, and rewritten.
41    When an <command>EXECUTE</command> command is subsequently
42    issued, the prepared statement is planned and executed.  This division
43    of labor avoids repetitive parse analysis work, while allowing
44    the execution plan to depend on the specific parameter values supplied.
45   </para>
46
47   <para>
48    Prepared statements can take parameters: values that are
49    substituted into the statement when it is executed. When creating
50    the prepared statement, refer to parameters by position, using
51    <literal>$1</>, <literal>$2</>, etc. A corresponding list of
52    parameter data types can optionally be specified. When a
53    parameter's data type is not specified or is declared as
54    <literal>unknown</literal>, the type is inferred from the context
55    in which the parameter is used (if possible). When executing the
56    statement, specify the actual values for these parameters in the
57    <command>EXECUTE</command> statement.  Refer to <xref
58    linkend="sql-execute"> for more
59    information about that.
60   </para>
61
62   <para>
63    Prepared statements only last for the duration of the current
64    database session. When the session ends, the prepared statement is
65    forgotten, so it must be recreated before being used again. This
66    also means that a single  prepared statement cannot be used by
67    multiple simultaneous database clients; however, each client can create
68    their own prepared statement to use.  Prepared statements can be
69    manually cleaned up using the <xref linkend="sql-deallocate"> command.
70   </para>
71
72   <para>
73    Prepared statements potentially have the largest performance advantage
74    when a single session is being used to execute a large number of similar
75    statements. The performance difference will be particularly
76    significant if the statements are complex to plan or rewrite, e.g.
77    if the query involves a join of many tables or requires
78    the application of several rules. If the statement is relatively simple
79    to plan and rewrite but relatively expensive to execute, the
80    performance advantage of prepared statements will be less noticeable.
81   </para>
82  </refsect1>
83
84  <refsect1>
85   <title>Parameters</title>
86
87   <variablelist>
88    <varlistentry>
89     <term><replaceable class="PARAMETER">name</replaceable></term>
90     <listitem>
91      <para>
92       An arbitrary name given to this particular prepared
93       statement. It must be unique within a single session and is
94       subsequently used to execute or deallocate a previously prepared
95       statement.
96      </para>
97     </listitem>
98    </varlistentry>
99
100    <varlistentry>
101     <term><replaceable class="PARAMETER">data_type</replaceable></term>
102     <listitem>
103      <para>
104       The data type of a parameter to the prepared statement.  If the
105       data type of a particular parameter is unspecified or is
106       specified as <literal>unknown</literal>, it will be inferred
107       from the context in which the parameter is used. To refer to the
108       parameters in the prepared statement itself, use
109       <literal>$1</literal>, <literal>$2</literal>, etc.
110      </para>
111     </listitem>
112    </varlistentry>
113
114    <varlistentry>
115     <term><replaceable class="PARAMETER">statement</replaceable></term>
116     <listitem>
117      <para>
118       Any <command>SELECT</>, <command>INSERT</>, <command>UPDATE</>,
119       <command>DELETE</>, or <command>VALUES</> statement.
120      </para>
121     </listitem>
122    </varlistentry>
123   </variablelist>
124  </refsect1>
125
126  <refsect1 id="SQL-PREPARE-notes">
127   <title>Notes</title>
128
129   <para>
130    Prepared statements can use generic plans rather than re-planning with
131    each set of supplied <command>EXECUTE</command> values.  This occurs
132    immediately for prepared statements with no parameters; otherwise
133    it occurs only after five or more executions produce plans whose
134    estimated cost average (including planning overhead) is more expensive
135    than the generic plan cost estimate.  Once a generic plan is chosen,
136    it is used for the remaining lifetime of the prepared statement.
137    Using <command>EXECUTE</command> values which are rare in columns with
138    many duplicates can generate custom plans that are so much cheaper
139    than the generic plan, even after adding planning overhead, that the
140    generic plan might never be used.
141   </para>
142
143   <para>
144    A generic plan assumes that each value supplied to
145    <command>EXECUTE</command> is one of the column's distinct values
146    and that column values are uniformly distributed.  For example,
147    if statistics record three distinct column values, a generic plan
148    assumes a column equality comparison will match 33% of processed rows.
149    Column statistics also allow generic plans to accurately compute the
150    selectivity of unique columns.  Comparisons on non-uniformly-distributed
151    columns and specification of non-existent values affects the average
152    plan cost, and hence if and when a generic plan is chosen.
153   </para>
154
155   <para>
156    To examine the query plan <productname>PostgreSQL</productname> is using
157    for a prepared statement, use <xref linkend="sql-explain">, e.g.
158    <command>EXPLAIN EXECUTE</>.
159    If a generic plan is in use, it will contain parameter symbols
160    <literal>$<replaceable>n</></literal>, while a custom plan will have the
161    supplied parameter values substituted into it.
162    The row estimates in the generic plan reflect the selectivity
163    computed for the parameters.
164   </para>
165
166   <para>
167    For more information on query planning and the statistics collected
168    by <productname>PostgreSQL</productname> for that purpose, see
169    the <xref linkend="sql-analyze">
170    documentation.
171   </para>
172
173   <para>
174    Although the main point of a prepared statement is to avoid repeated parse
175    analysis and planning of the statement, <productname>PostgreSQL</> will
176    force re-analysis and re-planning of the statement before using it
177    whenever database objects used in the statement have undergone
178    definitional (DDL) changes since the previous use of the prepared
179    statement.  Also, if the value of <xref linkend="guc-search-path"> changes
180    from one use to the next, the statement will be re-parsed using the new
181    <varname>search_path</>.  (This latter behavior is new as of
182    <productname>PostgreSQL</productname> 9.3.)  These rules make use of a
183    prepared statement semantically almost equivalent to re-submitting the
184    same query text over and over, but with a performance benefit if no object
185    definitions are changed, especially if the best plan remains the same
186    across uses.  An example of a case where the semantic equivalence is not
187    perfect is that if the statement refers to a table by an unqualified name,
188    and then a new table of the same name is created in a schema appearing
189    earlier in the <varname>search_path</>, no automatic re-parse will occur
190    since no object used in the statement changed.  However, if some other
191    change forces a re-parse, the new table will be referenced in subsequent
192    uses.
193   </para>
194
195   <para>
196    You can see all prepared statements available in the session by querying the
197    <link linkend="view-pg-prepared-statements"><structname>pg_prepared_statements</structname></link>
198    system view.
199   </para>
200  </refsect1>
201
202  <refsect1 id="sql-prepare-examples">
203   <title id="sql-prepare-examples-title">Examples</title>
204   <para>
205    Create a prepared statement for an <command>INSERT</command>
206    statement, and then execute it:
207 <programlisting>
208 PREPARE fooplan (int, text, bool, numeric) AS
209     INSERT INTO foo VALUES($1, $2, $3, $4);
210 EXECUTE fooplan(1, 'Hunter Valley', 't', 200.00);
211 </programlisting>
212   </para>
213
214   <para>
215    Create a prepared statement for a <command>SELECT</command>
216    statement, and then execute it:
217 <programlisting>
218 PREPARE usrrptplan (int) AS
219     SELECT * FROM users u, logs l WHERE u.usrid=$1 AND u.usrid=l.usrid
220     AND l.date = $2;
221 EXECUTE usrrptplan(1, current_date);
222 </programlisting>
223
224    Note that the data type of the second parameter is not specified,
225    so it is inferred from the context in which <literal>$2</> is used.
226   </para>
227  </refsect1>
228  <refsect1>
229   <title>Compatibility</title>
230
231   <para>
232    The SQL standard includes a <command>PREPARE</command> statement,
233    but it is only for use in embedded SQL. This version of the
234    <command>PREPARE</command> statement also uses a somewhat different
235    syntax.
236   </para>
237  </refsect1>
238
239  <refsect1>
240   <title>See Also</title>
241
242   <simplelist type="inline">
243    <member><xref linkend="sql-deallocate"></member>
244    <member><xref linkend="sql-execute"></member>
245   </simplelist>
246  </refsect1>
247 </refentry>