Re: rows estimate in explain analyze for the BRIN index - Mailing list pgsql-hackers
From | Tom Lane |
---|---|
Subject | Re: rows estimate in explain analyze for the BRIN index |
Date | |
Msg-id | 15870.1451493847@sss.pgh.pa.us Whole thread Raw |
In response to | Re: rows estimate in explain analyze for the BRIN index (Oleksii Kliukin <alexk@hintbits.com>) |
Responses |
Re: rows estimate in explain analyze for the BRIN index
|
List | pgsql-hackers |
Oleksii Kliukin <alexk@hintbits.com> writes: >> On 30 Dec 2015, at 17:02, Tom Lane <tgl@sss.pgh.pa.us> wrote: >> Another idea would be to use the heap's row density as calculated >> by the last ANALYZE (ie, reltuples/relpages), with a fallback to 100 >> if relpages=0. This'd only be convenient if the bitmap scan node has >> the parent heap rel open, which it might not. > +1 Any objections to the attached? regards, tom lane diff --git a/src/backend/access/brin/brin.c b/src/backend/access/brin/brin.c index 2622a7e..64bf788 100644 *** a/src/backend/access/brin/brin.c --- b/src/backend/access/brin/brin.c *************** bringetbitmap(PG_FUNCTION_ARGS) *** 279,286 **** Relation heapRel; BrinOpaque *opaque; BlockNumber nblocks; BlockNumber heapBlk; ! int totalpages = 0; FmgrInfo *consistentFn; MemoryContext oldcxt; MemoryContext perRangeCxt; --- 279,287 ---- Relation heapRel; BrinOpaque *opaque; BlockNumber nblocks; + int heap_tuples_per_page; BlockNumber heapBlk; ! int64 totalpages = 0; FmgrInfo *consistentFn; MemoryContext oldcxt; MemoryContext perRangeCxt; *************** bringetbitmap(PG_FUNCTION_ARGS) *** 291,301 **** /* * We need to know the size of the table so that we know how long to ! * iterate on the revmap. */ heapOid = IndexGetRelation(RelationGetRelid(idxRel), false); heapRel = heap_open(heapOid, AccessShareLock); nblocks = RelationGetNumberOfBlocks(heapRel); heap_close(heapRel, AccessShareLock); /* --- 292,309 ---- /* * We need to know the size of the table so that we know how long to ! * iterate on the revmap. While we have it open, estimate the number of ! * tuples per heap page for use later. */ heapOid = IndexGetRelation(RelationGetRelid(idxRel), false); heapRel = heap_open(heapOid, AccessShareLock); nblocks = RelationGetNumberOfBlocks(heapRel); + if (heapRel->rd_rel->relpages != 0 && heapRel->rd_rel->reltuples > 0) + heap_tuples_per_page = (int) + ((double) heapRel->rd_rel->reltuples / + (BlockNumber) heapRel->rd_rel->relpages); + else /* if no info, assume 100-byte tuples */ + heap_tuples_per_page = BLCKSZ / 100; heap_close(heapRel, AccessShareLock); /* *************** bringetbitmap(PG_FUNCTION_ARGS) *** 447,457 **** ReleaseBuffer(buf); /* ! * XXX We have an approximation of the number of *pages* that our scan ! * returns, but we don't have a precise idea of the number of heap tuples ! * involved. */ ! PG_RETURN_INT64(totalpages * 10); } /* --- 455,465 ---- ReleaseBuffer(buf); /* ! * We have an approximation of the number of pages that our scan returns, ! * but we don't have a precise idea of the number of heap tuples involved. ! * We have to estimate based on average tuple density. */ ! PG_RETURN_INT64(totalpages * heap_tuples_per_page); } /*
pgsql-hackers by date: