On Mon, Jun  6, 2016 at 07:19:37AM +0000, Albe Laurenz wrote:
> Bruce Momjian wrote:
> > OK, updated version attached.  I added "potential" to the first
> > paragraph, and added "estimated cost" to the later part, fixed the
> > "cheaper than", and clarified that we add the plan time cost to the
> > non-generic plan, which is how it can be cheaper than the generic plan.
> > I also moved the "Once a generic plan is chosen" line.
> > 
> > Yeah, that's a lot of changes, but they all improved the text.  Thanks.
> 
> Thanks for working on this.
> 
> !    Prepared statements can optionally use generic plans rather than
> !    re-planning with each set of supplied <command>EXECUTE</command> values.
> !    This occurs immediately for prepared statements with no parameters;
> !    otherwise it occurs only after five or more executions produce estimated
> !    plan costs, with planning overhead added, that are, on average, more
> !    expensive than the generic plan cost.
> 
> The following might be easier to understand:
> ... after five or more executions produce plans whose estimated cost average
> (including planning overhead) is more expensive than the generic plan cost 
> estimate.

Agreed.

> !    A generic plan assumes each value supplied to <command>EXECUTE</command>
> 
> ... assumes *that* each value ...

Agreed.

> !    is one of the column's distinct values and that column values are
> !    uniformly distributed.  For example, if statistics records three
> 
> Shouldn't it be "record"?
> The documentation treats "statistics" as a plural word throughout.

Agreed, not sure how I missed that.

> !    distinct column values, a generic plan assumes a column equality
> !    comparison will match 33% of processed rows.  Column statistics
> 
> ... assumes *that* a column equality comparison will match 33% of *the* 
> processed rows.

Uh, that seems overly wordy.  I think the rule is that if the sentence
makes sense without the words, you should not use them, but it is
clearly a judgement call in this case.  Do you agree?

> !    also allows generic plans to accurately compute the selectivity of
> 
> Column statistics also *allow* ...

Yep.

Updated patch attached.

One more thing --- there was talk of moving some of this into chapter
66, but as someone already mentioned, there are no subsections there
because it is a dedicated topic:

        66. How the Planner Uses Statistics.

I am not inclined to add a prepare-only section to that chapter.  On the
other hand, the issues described apply to PREPARE and to protocol-level
prepare, so having it in PREPARE also seems illogical.  However, I am
inclined to leave it in PREPARE until we are ready to move all of this
to chapter 66.

-- 
  Bruce Momjian  <br...@momjian.us>        http://momjian.us
  EnterpriseDB                             http://enterprisedb.com

+ As you are, so once was I. As I am, so you will be. +
+                     Ancient Roman grave inscription +
diff --git a/doc/src/sgml/ref/prepare.sgml b/doc/src/sgml/ref/prepare.sgml
new file mode 100644
index dbce8f2..1bf9179
*** a/doc/src/sgml/ref/prepare.sgml
--- b/doc/src/sgml/ref/prepare.sgml
*************** PREPARE <replaceable class="PARAMETER">n
*** 70,80 ****
    </para>
  
    <para>
!    Prepared statements have the largest performance advantage when a
!    single session is being used to execute a large number of similar
     statements. The performance difference will be particularly
!    significant if the statements are complex to plan or rewrite, for
!    example, if the query involves a join of many tables or requires
     the application of several rules. If the statement is relatively simple
     to plan and rewrite but relatively expensive to execute, the
     performance advantage of prepared statements will be less noticeable.
--- 70,80 ----
    </para>
  
    <para>
!    Prepared statements potentially have the largest performance advantage
!    when a single session is being used to execute a large number of similar
     statements. The performance difference will be particularly
!    significant if the statements are complex to plan or rewrite, e.g. 
!    if the query involves a join of many tables or requires
     the application of several rules. If the statement is relatively simple
     to plan and rewrite but relatively expensive to execute, the
     performance advantage of prepared statements will be less noticeable.
*************** PREPARE <replaceable class="PARAMETER">n
*** 127,140 ****
    <title>Notes</title>
  
    <para>
!    If a prepared statement is executed enough times, the server may eventually
!    decide to save and re-use a generic plan rather than re-planning each time.
!    This will occur immediately if the prepared statement has no parameters;
!    otherwise it occurs only if the generic plan appears to be not much more
!    expensive than a plan that depends on specific parameter values.
!    Typically, a generic plan will be selected only if the query's performance
!    is estimated to be fairly insensitive to the specific parameter values
!    supplied.
    </para>
  
    <para>
--- 127,151 ----
    <title>Notes</title>
  
    <para>
!    Prepared statements can optionally use generic plans rather than
!    re-planning with each set of supplied <command>EXECUTE</command> values.
!    This occurs immediately for prepared statements with no parameters;
!    otherwise it occurs only after five or more executions produce plans
!    whose estimated cost average (including planning overhead) is more
!    expensive than the generic plan cost estimate.  Once a generic plan is
!    chosen, it is used for the remaining lifetime of the prepared statement.
!   </para>
! 
!   <para>
!    A generic plan assumes that each value supplied to
!    <command>EXECUTE</command> is one of the column's distinct values
!    and that column values are uniformly distributed.  For example,
!    if statistics record three distinct column values, a generic plan
!    assumes a column equality comparison will match 33% of processed rows.
!    Column statistics also allow generic plans to accurately compute the
!    selectivity of unique columns.  Comparisons on non-uniformly-distributed
!    columns and specification of non-existent values affects the average
!    plan cost, and hence if and when a generic plan is chosen.
    </para>
  
    <para>
*************** PREPARE <replaceable class="PARAMETER">n
*** 142,148 ****
     for a prepared statement, use <xref linkend="sql-explain">.
     If a generic plan is in use, it will contain parameter symbols
     <literal>$<replaceable>n</></literal>, while a custom plan will have the
!    current actual parameter values substituted into it.
    </para>
  
    <para>
--- 153,161 ----
     for a prepared statement, use <xref linkend="sql-explain">.
     If a generic plan is in use, it will contain parameter symbols
     <literal>$<replaceable>n</></literal>, while a custom plan will have the
!    supplied parameter values substituted into it.
!    The row estimates in the generic plan reflect the selectivity
!    computed for the parameters.
    </para>
  
    <para>
-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to