summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane2009-06-22 20:04:28 +0000
committerTom Lane2009-06-22 20:04:28 +0000
commit83fba6bba1e1ea07ebeb3132e49985b43e2851cb (patch)
treee918de47dce5485e1624049ca420189994186915
parentb20155d50f979392c60519d4a88a0984adb28b4e (diff)
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.
-rw-r--r--src/backend/storage/buffer/README7
-rw-r--r--src/backend/storage/buffer/freelist.c6
2 files changed, 8 insertions, 5 deletions
diff --git a/src/backend/storage/buffer/README b/src/backend/storage/buffer/README
index bfacfea0f1..6669ab4028 100644
--- a/src/backend/storage/buffer/README
+++ b/src/backend/storage/buffer/README
@@ -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
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
diff --git a/src/backend/storage/buffer/freelist.c b/src/backend/storage/buffer/freelist.c
index b52a0c03d1..d16efcfbcd 100644
--- a/src/backend/storage/buffer/freelist.c
+++ b/src/backend/storage/buffer/freelist.c
@@ -368,9 +368,7 @@ GetAccessStrategy(BufferAccessStrategyType btype)
int ring_size;
/*
- * Select ring size to use. See buffer/README for rationales. (Currently
- * all cases are the same size, but keep this code structure for
- * flexibility.)
+ * Select ring size to use. See buffer/README for rationales.
*
* Note: if you change the ring size for BAS_BULKREAD, see also
* SYNC_SCAN_REPORT_INTERVAL in access/heap/syncscan.c.
@@ -385,7 +383,7 @@ GetAccessStrategy(BufferAccessStrategyType btype)
ring_size = 256 * 1024 / BLCKSZ;
break;
case BAS_BULKWRITE:
- ring_size = 256 * 1024 / BLCKSZ;
+ ring_size = 16 * 1024 * 1024 / BLCKSZ;
break;
case BAS_VACUUM:
ring_size = 256 * 1024 / BLCKSZ;