mirror of
https://github.com/postgres/postgres.git
synced 2025-05-25 00:04:05 -04:00
Allow the planner's estimate of the fraction of a cursor's rows that will be
retrieved to be controlled through a GUC variable. Robert Hell
This commit is contained in:
parent
cf9f6c8d8e
commit
db147b3483
@ -1,4 +1,4 @@
|
|||||||
<!-- $PostgreSQL: pgsql/doc/src/sgml/config.sgml,v 1.176 2008/05/01 19:55:40 tgl Exp $ -->
|
<!-- $PostgreSQL: pgsql/doc/src/sgml/config.sgml,v 1.177 2008/05/02 21:26:09 tgl Exp $ -->
|
||||||
|
|
||||||
<chapter Id="runtime-config">
|
<chapter Id="runtime-config">
|
||||||
<title>Server Configuration</title>
|
<title>Server Configuration</title>
|
||||||
@ -2238,6 +2238,26 @@ SELECT * FROM parent WHERE key = 2400;
|
|||||||
</listitem>
|
</listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry id="guc-cursor-tuple-fraction" xreflabel="cursor_tuple_fraction">
|
||||||
|
<term><varname>cursor_tuple_fraction</varname> (<type>floating point</type>)</term>
|
||||||
|
<indexterm>
|
||||||
|
<primary><varname>cursor_tuple_fraction</> configuration parameter</primary>
|
||||||
|
</indexterm>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Sets the planner's estimate of the fraction of a cursor's rows that
|
||||||
|
will be retrieved. The default is 0.1. Smaller values of this
|
||||||
|
setting bias the planner towards using <quote>fast start</> plans
|
||||||
|
for cursors, which will retrieve the first few rows quickly while
|
||||||
|
perhaps taking a long time to fetch all rows. Larger values
|
||||||
|
put more emphasis on the total estimated time. At the maximum
|
||||||
|
setting of 1.0, cursors are planned exactly like regular queries,
|
||||||
|
considering only the total estimated time and not how soon the
|
||||||
|
first rows might be delivered.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
<varlistentry id="guc-from-collapse-limit" xreflabel="from_collapse_limit">
|
<varlistentry id="guc-from-collapse-limit" xreflabel="from_collapse_limit">
|
||||||
<term><varname>from_collapse_limit</varname> (<type>integer</type>)</term>
|
<term><varname>from_collapse_limit</varname> (<type>integer</type>)</term>
|
||||||
<indexterm>
|
<indexterm>
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $PostgreSQL: pgsql/src/backend/optimizer/plan/planner.c,v 1.232 2008/04/17 21:22:14 tgl Exp $
|
* $PostgreSQL: pgsql/src/backend/optimizer/plan/planner.c,v 1.233 2008/05/02 21:26:09 tgl Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -42,6 +42,9 @@
|
|||||||
#include "utils/syscache.h"
|
#include "utils/syscache.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* GUC parameter */
|
||||||
|
double cursor_tuple_fraction = DEFAULT_CURSOR_TUPLE_FRACTION;
|
||||||
|
|
||||||
/* Hook for plugins to get control in planner() */
|
/* Hook for plugins to get control in planner() */
|
||||||
planner_hook_type planner_hook = NULL;
|
planner_hook_type planner_hook = NULL;
|
||||||
|
|
||||||
@ -142,11 +145,23 @@ standard_planner(Query *parse, int cursorOptions, ParamListInfo boundParams)
|
|||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* We have no real idea how many tuples the user will ultimately FETCH
|
* We have no real idea how many tuples the user will ultimately FETCH
|
||||||
* from a cursor, but it seems a good bet that he doesn't want 'em
|
* from a cursor, but it is often the case that he doesn't want 'em
|
||||||
* all. Optimize for 10% retrieval (you gotta better number? Should
|
* all, or would prefer a fast-start plan anyway so that he can
|
||||||
* this be a SETtable parameter?)
|
* process some of the tuples sooner. Use a GUC parameter to decide
|
||||||
|
* what fraction to optimize for.
|
||||||
*/
|
*/
|
||||||
tuple_fraction = 0.10;
|
tuple_fraction = cursor_tuple_fraction;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We document cursor_tuple_fraction as simply being a fraction,
|
||||||
|
* which means the edge cases 0 and 1 have to be treated specially
|
||||||
|
* here. We convert 1 to 0 ("all the tuples") and 0 to a very small
|
||||||
|
* fraction.
|
||||||
|
*/
|
||||||
|
if (tuple_fraction >= 1.0)
|
||||||
|
tuple_fraction = 0.0;
|
||||||
|
else if (tuple_fraction <= 0.0)
|
||||||
|
tuple_fraction = 1e-10;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
* Written by Peter Eisentraut <peter_e@gmx.net>.
|
* Written by Peter Eisentraut <peter_e@gmx.net>.
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.450 2008/05/01 19:55:40 tgl Exp $
|
* $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.451 2008/05/02 21:26:10 tgl Exp $
|
||||||
*
|
*
|
||||||
*--------------------------------------------------------------------
|
*--------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -1891,6 +1891,16 @@ static struct config_real ConfigureNamesReal[] =
|
|||||||
DEFAULT_CPU_OPERATOR_COST, 0, DBL_MAX, NULL, NULL
|
DEFAULT_CPU_OPERATOR_COST, 0, DBL_MAX, NULL, NULL
|
||||||
},
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
{"cursor_tuple_fraction", PGC_USERSET, QUERY_TUNING_OTHER,
|
||||||
|
gettext_noop("Sets the planner's estimate of the fraction of "
|
||||||
|
"a cursor's rows that will be retrieved."),
|
||||||
|
NULL
|
||||||
|
},
|
||||||
|
&cursor_tuple_fraction,
|
||||||
|
DEFAULT_CURSOR_TUPLE_FRACTION, 0.0, 1.0, NULL, NULL
|
||||||
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
{"geqo_selection_bias", PGC_USERSET, QUERY_TUNING_GEQO,
|
{"geqo_selection_bias", PGC_USERSET, QUERY_TUNING_GEQO,
|
||||||
gettext_noop("GEQO: selective pressure within the population."),
|
gettext_noop("GEQO: selective pressure within the population."),
|
||||||
|
@ -219,6 +219,7 @@
|
|||||||
|
|
||||||
#default_statistics_target = 10 # range 1-1000
|
#default_statistics_target = 10 # range 1-1000
|
||||||
#constraint_exclusion = off
|
#constraint_exclusion = off
|
||||||
|
#cursor_tuple_fraction = 0.1 # range 0.0-1.0
|
||||||
#from_collapse_limit = 8
|
#from_collapse_limit = 8
|
||||||
#join_collapse_limit = 8 # 1 disables collapsing of explicit
|
#join_collapse_limit = 8 # 1 disables collapsing of explicit
|
||||||
# JOIN clauses
|
# JOIN clauses
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
* Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
|
* Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
|
||||||
* Portions Copyright (c) 1994, Regents of the University of California
|
* Portions Copyright (c) 1994, Regents of the University of California
|
||||||
*
|
*
|
||||||
* $PostgreSQL: pgsql/src/include/optimizer/planmain.h,v 1.107 2008/04/17 21:22:14 tgl Exp $
|
* $PostgreSQL: pgsql/src/include/optimizer/planmain.h,v 1.108 2008/05/02 21:26:10 tgl Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -17,6 +17,10 @@
|
|||||||
#include "nodes/plannodes.h"
|
#include "nodes/plannodes.h"
|
||||||
#include "nodes/relation.h"
|
#include "nodes/relation.h"
|
||||||
|
|
||||||
|
/* GUC parameters */
|
||||||
|
#define DEFAULT_CURSOR_TUPLE_FRACTION 0.1
|
||||||
|
extern double cursor_tuple_fraction;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* prototypes for plan/planmain.c
|
* prototypes for plan/planmain.c
|
||||||
*/
|
*/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user