Commit 6382448c authored by Tom Lane's avatar Tom Lane

For bulk write operations (eg COPY IN), use a ring buffer of 16MB instead

of the 256KB limit originally enforced by a patch committed 2008-11-06.
Per recent test results, the smaller size resulted in an undesirable decrease
in bulk data loading speed, due to COPY processing frequently getting blocked
for WAL flushing.  This area might need more tweaking later, but this setting
seems to be good enough for 8.4.
parent 3f1e529e
$PostgreSQL: pgsql/src/backend/storage/buffer/README,v 1.16 2009/02/18 15:58:41 heikki Exp $ $PostgreSQL: pgsql/src/backend/storage/buffer/README,v 1.17 2009/06/22 20:04:28 tgl Exp $
Notes About Shared Buffer Access Rules Notes About Shared Buffer Access Rules
====================================== ======================================
...@@ -237,7 +237,12 @@ buffer, resulting in excessive WAL flushing. Allowing VACUUM to update ...@@ -237,7 +237,12 @@ buffer, resulting in excessive WAL flushing. Allowing VACUUM to update
Bulk writes work similarly to VACUUM. Currently this applies only to Bulk writes work similarly to VACUUM. Currently this applies only to
COPY IN and CREATE TABLE AS SELECT. (Might it be interesting to make COPY IN and CREATE TABLE AS SELECT. (Might it be interesting to make
seqscan UPDATE and DELETE use the bulkwrite strategy?) seqscan UPDATE and DELETE use the bulkwrite strategy?) For bulk writes
we use a ring size of 16MB (but not more than 1/8th of shared_buffers).
Smaller sizes have been shown to result in the COPY blocking too often
for WAL flushes. While it's okay for a background vacuum to be slowed by
doing its own WAL flushing, we'd prefer that COPY not be subject to that,
so we let it use up a bit more of the buffer arena.
Background Writer's Processing Background Writer's Processing
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/storage/buffer/freelist.c,v 1.66 2009/01/01 17:23:47 momjian Exp $ * $PostgreSQL: pgsql/src/backend/storage/buffer/freelist.c,v 1.67 2009/06/22 20:04:28 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -368,9 +368,7 @@ GetAccessStrategy(BufferAccessStrategyType btype) ...@@ -368,9 +368,7 @@ GetAccessStrategy(BufferAccessStrategyType btype)
int ring_size; int ring_size;
/* /*
* Select ring size to use. See buffer/README for rationales. (Currently * Select ring size to use. See buffer/README for rationales.
* all cases are the same size, but keep this code structure for
* flexibility.)
* *
* Note: if you change the ring size for BAS_BULKREAD, see also * Note: if you change the ring size for BAS_BULKREAD, see also
* SYNC_SCAN_REPORT_INTERVAL in access/heap/syncscan.c. * SYNC_SCAN_REPORT_INTERVAL in access/heap/syncscan.c.
...@@ -385,7 +383,7 @@ GetAccessStrategy(BufferAccessStrategyType btype) ...@@ -385,7 +383,7 @@ GetAccessStrategy(BufferAccessStrategyType btype)
ring_size = 256 * 1024 / BLCKSZ; ring_size = 256 * 1024 / BLCKSZ;
break; break;
case BAS_BULKWRITE: case BAS_BULKWRITE:
ring_size = 256 * 1024 / BLCKSZ; ring_size = 16 * 1024 * 1024 / BLCKSZ;
break; break;
case BAS_VACUUM: case BAS_VACUUM:
ring_size = 256 * 1024 / BLCKSZ; ring_size = 256 * 1024 / BLCKSZ;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment