mirror of
https://github.com/postgres/postgres.git
synced 2025-11-19 13:42:17 +03:00
Use streaming read I/O in BRIN vacuum scan.
This commit implements streaming read I/O for BRIN vacuum scans. Although BRIN indexes tend to be relatively small by design, performance tests have shown performance improvements. Author: Arseniy Mukhin <arseniy.mukhin.dev@gmail.com> Discussion: https://postgr.es/m/CAE7r3ML01aiq9Th_1OSz7U7Aq2pWbhMLoz5T%2BPXcg8J9ZAPFFA%40mail.gmail.com
This commit is contained in:
@@ -2171,28 +2171,42 @@ union_tuples(BrinDesc *bdesc, BrinMemTuple *a, BrinTuple *b)
|
|||||||
static void
|
static void
|
||||||
brin_vacuum_scan(Relation idxrel, BufferAccessStrategy strategy)
|
brin_vacuum_scan(Relation idxrel, BufferAccessStrategy strategy)
|
||||||
{
|
{
|
||||||
BlockNumber nblocks;
|
BlockRangeReadStreamPrivate p;
|
||||||
BlockNumber blkno;
|
ReadStream *stream;
|
||||||
|
Buffer buf;
|
||||||
|
|
||||||
|
p.current_blocknum = 0;
|
||||||
|
p.last_exclusive = RelationGetNumberOfBlocks(idxrel);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* It is safe to use batchmode as block_range_read_stream_cb takes no
|
||||||
|
* locks.
|
||||||
|
*/
|
||||||
|
stream = read_stream_begin_relation(READ_STREAM_MAINTENANCE |
|
||||||
|
READ_STREAM_FULL |
|
||||||
|
READ_STREAM_USE_BATCHING,
|
||||||
|
strategy,
|
||||||
|
idxrel,
|
||||||
|
MAIN_FORKNUM,
|
||||||
|
block_range_read_stream_cb,
|
||||||
|
&p,
|
||||||
|
0);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Scan the index in physical order, and clean up any possible mess in
|
* Scan the index in physical order, and clean up any possible mess in
|
||||||
* each page.
|
* each page.
|
||||||
*/
|
*/
|
||||||
nblocks = RelationGetNumberOfBlocks(idxrel);
|
while ((buf = read_stream_next_buffer(stream, NULL)) != InvalidBuffer)
|
||||||
for (blkno = 0; blkno < nblocks; blkno++)
|
|
||||||
{
|
{
|
||||||
Buffer buf;
|
|
||||||
|
|
||||||
CHECK_FOR_INTERRUPTS();
|
CHECK_FOR_INTERRUPTS();
|
||||||
|
|
||||||
buf = ReadBufferExtended(idxrel, MAIN_FORKNUM, blkno,
|
|
||||||
RBM_NORMAL, strategy);
|
|
||||||
|
|
||||||
brin_page_cleanup(idxrel, buf);
|
brin_page_cleanup(idxrel, buf);
|
||||||
|
|
||||||
ReleaseBuffer(buf);
|
ReleaseBuffer(buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
read_stream_end(stream);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Update all upper pages in the index's FSM, as well. This ensures not
|
* Update all upper pages in the index's FSM, as well. This ensures not
|
||||||
* only that we propagate leaf-page FSM updates made by brin_page_cleanup,
|
* only that we propagate leaf-page FSM updates made by brin_page_cleanup,
|
||||||
|
|||||||
Reference in New Issue
Block a user