]> granicus.if.org Git - postgresql/commitdiff
Add a GUC variable "synchronize_seqscans" to allow clients to disable the new
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 30 Jan 2008 18:35:55 +0000 (18:35 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 30 Jan 2008 18:35:55 +0000 (18:35 +0000)
synchronized-scanning behavior, and make pg_dump disable sync scans so that
it will reliably preserve row ordering.  Per recent discussions.

doc/src/sgml/config.sgml
src/backend/access/heap/heapam.c
src/backend/utils/misc/guc.c
src/backend/utils/misc/postgresql.conf.sample
src/bin/pg_dump/pg_dump.c

index 30ca1c219c94232c13d2440806b1258225c4d9c1..05996b491088328fa0579ddbbdfc1123e6e999e5 100644 (file)
@@ -1,4 +1,4 @@
-<!-- $PostgreSQL: pgsql/doc/src/sgml/config.sgml,v 1.162 2008/01/27 19:12:28 tgl Exp $ -->
+<!-- $PostgreSQL: pgsql/doc/src/sgml/config.sgml,v 1.163 2008/01/30 18:35:55 tgl Exp $ -->
 
 <chapter Id="runtime-config">
   <title>Server Configuration</title>
@@ -4611,6 +4611,28 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir'
       </listitem>
      </varlistentry>
 
+     <varlistentry id="guc-synchronize-seqscans" xreflabel="synchronize_seqscans">
+      <term><varname>synchronize_seqscans</varname> (<type>boolean</type>)</term>
+      <indexterm>
+       <primary><varname>synchronize_seqscans</> configuration parameter</primary>
+      </indexterm>
+      <listitem>
+       <para>
+        This allows sequential scans of large tables to synchronize with each
+        other, so that concurrent scans read the same block at about the
+        same time and hence share the I/O workload.  When this is enabled,
+        a scan might start in the middle of the table and then <quote>wrap
+        around</> the end to cover all rows, so as to synchronize with the
+        activity of scans already in progress.  This can result in
+        unpredictable changes in the row ordering returned by queries that
+        have no <literal>ORDER BY</> clause.  Setting this parameter to
+        <literal>off</> ensures the pre-8.3 behavior in which a sequential
+        scan always starts from the beginning of the table.  The default
+        is <literal>on</>.
+       </para>
+      </listitem>
+     </varlistentry>
+
      </variablelist>
     </sect2>
 
index 7134581333a6b550881c565b738b5b9e45ba5b13..c3a45b98db5bda0a96cf00cba0fa0d0fab0048c5 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/access/heap/heapam.c,v 1.248 2008/01/14 01:39:09 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/access/heap/heapam.c,v 1.249 2008/01/30 18:35:55 tgl Exp $
  *
  *
  * INTERFACE ROUTINES
 #include "utils/syscache.h"
 
 
+/* GUC variable */
+bool   synchronize_seqscans = true;
+
+
 static HeapScanDesc heap_beginscan_internal(Relation relation,
                                                Snapshot snapshot,
                                                int nkeys, ScanKey key,
@@ -104,7 +108,8 @@ initscan(HeapScanDesc scan, ScanKey key)
         * the thresholds for these features could be different, we make them the
         * same so that there are only two behaviors to tune rather than four.
         * (However, some callers need to be able to disable one or both of
-        * these behaviors, independently of the size of the table.)
+        * these behaviors, independently of the size of the table; also there
+        * is a GUC variable that can disable synchronized scanning.)
         *
         * During a rescan, don't make a new strategy object if we don't have to.
         */
@@ -129,7 +134,7 @@ initscan(HeapScanDesc scan, ScanKey key)
                scan->rs_strategy = NULL;
        }
 
-       if (allow_sync)
+       if (allow_sync && synchronize_seqscans)
        {
                scan->rs_syncscan = true;
                scan->rs_startblock = ss_get_location(scan->rs_rd, scan->rs_nblocks);
index e3e04f4d3418244fe6cf036978062aa937214035..1dbffbfb4825bdb3eadc46af06c2f373728487e8 100644 (file)
@@ -10,7 +10,7 @@
  * Written by Peter Eisentraut <peter_e@gmx.net>.
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.431 2008/01/27 19:12:28 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.432 2008/01/30 18:35:55 tgl Exp $
  *
  *--------------------------------------------------------------------
  */
@@ -110,6 +110,7 @@ extern int  CommitDelay;
 extern int     CommitSiblings;
 extern char *default_tablespace;
 extern char *temp_tablespaces;
+extern bool synchronize_seqscans;
 extern bool fullPageWrites;
 
 #ifdef TRACE_SORT
@@ -1052,6 +1053,15 @@ static struct config_bool ConfigureNamesBool[] =
                false, NULL, NULL
        },
 
+       {
+               {"synchronize_seqscans", PGC_USERSET, COMPAT_OPTIONS_PREVIOUS,
+                       gettext_noop("Enable synchronized sequential scans."),
+                       NULL
+               },
+               &synchronize_seqscans,
+               true, NULL, NULL
+       },
+
        {
                {"archive_mode", PGC_POSTMASTER, WAL_SETTINGS,
                        gettext_noop("Allows archiving of WAL files using archive_command."),
index d9b9532395ea9c287cf6f22a6816f138e1c637d3..258a7d1a4f519942d23b3eef13ea54be9fbaf5d2 100644 (file)
 #backslash_quote = safe_encoding       # on, off, or safe_encoding
 #default_with_oids = off
 #escape_string_warning = on
-#standard_conforming_strings = off
 #regex_flavor = advanced               # advanced, extended, or basic
 #sql_inheritance = on
+#standard_conforming_strings = off
+#synchronize_seqscans = on
 
 # - Other Platforms and Clients -
 
index 3e53a64cd461c70e07f1c3d8314c77d54d00bbcd..c284bbb2da9637cd61ff252a237769b13760ad28 100644 (file)
@@ -12,7 +12,7 @@
  *     by PostgreSQL
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/bin/pg_dump/pg_dump.c,v 1.481 2008/01/01 19:45:55 momjian Exp $
+ *       $PostgreSQL: pgsql/src/bin/pg_dump/pg_dump.c,v 1.482 2008/01/30 18:35:55 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -552,6 +552,20 @@ main(int argc, char **argv)
        /* Set the datestyle to ISO to ensure the dump's portability */
        do_sql_command(g_conn, "SET DATESTYLE = ISO");
 
+       /*
+        * If supported, set extra_float_digits so that we can dump float data
+        * exactly (given correctly implemented float I/O code, anyway)
+        */
+       if (g_fout->remoteVersion >= 70400)
+               do_sql_command(g_conn, "SET extra_float_digits TO 2");
+
+       /*
+        * If synchronized scanning is supported, disable it, to prevent
+        * unpredictable changes in row ordering across a dump and reload.
+        */
+       if (g_fout->remoteVersion >= 80300)
+               do_sql_command(g_conn, "SET synchronize_seqscans TO off");
+
        /*
         * Start serializable transaction to dump consistent data.
         */
@@ -567,13 +581,6 @@ main(int argc, char **argv)
        else
                username_subquery = "SELECT usename FROM pg_user WHERE usesysid =";
 
-       /*
-        * If supported, set extra_float_digits so that we can dump float data
-        * exactly (given correctly implemented float I/O code, anyway)
-        */
-       if (g_fout->remoteVersion >= 70400)
-               do_sql_command(g_conn, "SET extra_float_digits TO 2");
-
        /* Find the last built-in OID, if needed */
        if (g_fout->remoteVersion < 70300)
        {