retrieved to be controlled through a GUC variable.
Robert Hell
-<!-- $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">
   <title>Server Configuration</title>
       </listitem>
      </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">
       <term><varname>from_collapse_limit</varname> (<type>integer</type>)</term>
       <indexterm>
 
  *
  *
  * 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 $
  *
  *-------------------------------------------------------------------------
  */
 #include "utils/syscache.h"
 
 
+/* GUC parameter */
+double cursor_tuple_fraction = DEFAULT_CURSOR_TUPLE_FRACTION;
+
 /* Hook for plugins to get control in planner() */
 planner_hook_type planner_hook = NULL;
 
    {
        /*
         * 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
-        * all.  Optimize for 10% retrieval (you gotta better number?  Should
-        * this be a SETtable parameter?)
+        * from a cursor, but it is often the case that he doesn't want 'em
+        * all, or would prefer a fast-start plan anyway so that he can
+        * process some of the tuples sooner.  Use a GUC parameter to decide
+        * what fraction to optimize for.
+        */
+       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.
         */
-       tuple_fraction = 0.10;
+       if (tuple_fraction >= 1.0)
+           tuple_fraction = 0.0;
+       else if (tuple_fraction <= 0.0)
+           tuple_fraction = 1e-10;
    }
    else
    {
 
  *
  * 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 $
  *
  *--------------------------------------------------------------------
  */
        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,
            gettext_noop("GEQO: selective pressure within the population."),
 
 
 #default_statistics_target = 10        # range 1-1000
 #constraint_exclusion = off
+#cursor_tuple_fraction = 0.1       # range 0.0-1.0
 #from_collapse_limit = 8
 #join_collapse_limit = 8       # 1 disables collapsing of explicit 
                    # JOIN clauses
 
  * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
  * 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 $
  *
  *-------------------------------------------------------------------------
  */
 #include "nodes/plannodes.h"
 #include "nodes/relation.h"
 
+/* GUC parameters */
+#define DEFAULT_CURSOR_TUPLE_FRACTION 0.1
+extern double cursor_tuple_fraction;
+
 /*
  * prototypes for plan/planmain.c
  */