From: Tom Lane Date: Wed, 30 Jan 2008 18:35:55 +0000 (+0000) Subject: Add a GUC variable "synchronize_seqscans" to allow clients to disable the new X-Git-Tag: REL8_3_0~18 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=47df4f668826c0646ae30d37971e4ff15e77b3e3;p=postgresql Add a GUC variable "synchronize_seqscans" to allow clients to disable the new synchronized-scanning behavior, and make pg_dump disable sync scans so that it will reliably preserve row ordering. Per recent discussions. --- diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml index 30ca1c219c..05996b4910 100644 --- a/doc/src/sgml/config.sgml +++ b/doc/src/sgml/config.sgml @@ -1,4 +1,4 @@ - + Server Configuration @@ -4611,6 +4611,28 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir' + + synchronize_seqscans (boolean) + + synchronize_seqscans configuration parameter + + + + 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 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 ORDER BY clause. Setting this parameter to + off ensures the pre-8.3 behavior in which a sequential + scan always starts from the beginning of the table. The default + is on. + + + + diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c index 7134581333..c3a45b98db 100644 --- a/src/backend/access/heap/heapam.c +++ b/src/backend/access/heap/heapam.c @@ -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 @@ -59,6 +59,10 @@ #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); diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index e3e04f4d34..1dbffbfb48 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -10,7 +10,7 @@ * Written by Peter Eisentraut . * * 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."), diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample index d9b9532395..258a7d1a4f 100644 --- a/src/backend/utils/misc/postgresql.conf.sample +++ b/src/backend/utils/misc/postgresql.conf.sample @@ -476,9 +476,10 @@ #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 - diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index 3e53a64cd4..c284bbb2da 100644 --- a/src/bin/pg_dump/pg_dump.c +++ b/src/bin/pg_dump/pg_dump.c @@ -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) {