From 849b7a7107cc042560284d5eb537cc03114739b1 Mon Sep 17 00:00:00 2001 From: Andrey Borodin Date: Mon, 7 Sep 2020 12:08:00 +0500 Subject: [PATCH v2] nbtree faster logging --- src/backend/access/nbtree/nbtsort.c | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/src/backend/access/nbtree/nbtsort.c b/src/backend/access/nbtree/nbtsort.c index efee86784b..c389f85112 100644 --- a/src/backend/access/nbtree/nbtsort.c +++ b/src/backend/access/nbtree/nbtsort.c @@ -254,6 +254,9 @@ typedef struct BTWriteState BlockNumber btws_pages_alloced; /* # pages allocated */ BlockNumber btws_pages_written; /* # pages written out */ Page btws_zeropage; /* workspace for filling zeroes */ + + BlockNumber last_written; + BlockNumber last_logged; } BTWriteState; @@ -570,6 +573,9 @@ _bt_leafbuild(BTSpool *btspool, BTSpool *btspool2) wstate.btws_pages_written = 0; wstate.btws_zeropage = NULL; /* until needed */ + wstate.last_logged = BTREE_METAPAGE; + wstate.last_written = BTREE_METAPAGE; + pgstat_progress_update_param(PROGRESS_CREATEIDX_SUBPHASE, PROGRESS_BTREE_PHASE_LEAF_LOAD); _bt_load(&wstate, btspool, btspool2); @@ -643,8 +649,24 @@ _bt_blwritepage(BTWriteState *wstate, Page page, BlockNumber blkno) /* XLOG stuff */ if (wstate->btws_use_wal) { - /* We use the XLOG_FPI record type for this */ - log_newpage(&wstate->index->rd_node, MAIN_FORKNUM, blkno, page, true); + if (blkno != BTREE_METAPAGE && + blkno == wstate->last_written + 1 && + blkno < wstate->last_logged + XLR_MAX_BLOCK_ID) + { + /* Fast path for batching */ + } + else + { + if (blkno != wstate->last_written + 1) + /* We use the XLOG_FPI record type for this */ + log_newpage(&wstate->index->rd_node, MAIN_FORKNUM, blkno, page, true); + else + wstate->last_written++; + if (wstate->last_logged < wstate->last_written) + log_newpage_range(&wstate->index->rd_node, MAIN_FORKNUM, + wstate->last_logged + 1, wstate->last_written + 1, true); + wstate->last_logged = wstate->last_written = blkno; + } } /* -- 2.24.3 (Apple Git-128)