diff options
Diffstat (limited to 'src/backend')
-rw-r--r-- | src/backend/access/heap/heapam.c | 40 | ||||
-rw-r--r-- | src/backend/executor/nodeBitmapHeapscan.c | 23 |
2 files changed, 40 insertions, 23 deletions
diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c index a0b561c209e..2c9dc9a949c 100644 --- a/src/backend/access/heap/heapam.c +++ b/src/backend/access/heap/heapam.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/heap/heapam.c,v 1.235 2007/06/08 18:23:52 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/access/heap/heapam.c,v 1.236 2007/06/09 18:49:54 tgl Exp $ * * * INTERFACE ROUTINES @@ -58,6 +58,10 @@ #include "utils/syscache.h" +static HeapScanDesc heap_beginscan_internal(Relation relation, + Snapshot snapshot, + int nkeys, ScanKey key, + bool is_bitmapscan); static XLogRecPtr log_heap_update(Relation reln, Buffer oldbuf, ItemPointerData from, Buffer newbuf, HeapTuple newtup, bool move); @@ -95,8 +99,9 @@ initscan(HeapScanDesc scan, ScanKey key) * * During a rescan, don't make a new strategy object if we don't have to. */ - if (scan->rs_nblocks > NBuffers / 4 && - !scan->rs_rd->rd_istemp) + if (!scan->rs_bitmapscan && + !scan->rs_rd->rd_istemp && + scan->rs_nblocks > NBuffers / 4) { if (scan->rs_strategy == NULL) scan->rs_strategy = GetAccessStrategy(BAS_BULKREAD); @@ -114,8 +119,6 @@ initscan(HeapScanDesc scan, ScanKey key) scan->rs_startblock = 0; } - /* rs_pageatatime was set when the snapshot was filled in */ - scan->rs_inited = false; scan->rs_ctup.t_data = NULL; ItemPointerSetInvalid(&scan->rs_ctup.t_self); @@ -133,7 +136,12 @@ initscan(HeapScanDesc scan, ScanKey key) if (key != NULL) memcpy(scan->rs_key, key, scan->rs_nkeys * sizeof(ScanKeyData)); - pgstat_count_heap_scan(scan->rs_rd); + /* + * Currently, we don't have a stats counter for bitmap heap scans + * (but the underlying bitmap index scans will be counted). + */ + if (!scan->rs_bitmapscan) + pgstat_count_heap_scan(scan->rs_rd); } /* @@ -1037,12 +1045,31 @@ heap_openrv(const RangeVar *relation, LOCKMODE lockmode) /* ---------------- * heap_beginscan - begin relation scan + * + * heap_beginscan_bm is an alternate entry point for setting up a HeapScanDesc + * for a bitmap heap scan. Although that scan technology is really quite + * unlike a standard seqscan, there is just enough commonality to make it + * worth using the same data structure. * ---------------- */ HeapScanDesc heap_beginscan(Relation relation, Snapshot snapshot, int nkeys, ScanKey key) { + return heap_beginscan_internal(relation, snapshot, nkeys, key, false); +} + +HeapScanDesc +heap_beginscan_bm(Relation relation, Snapshot snapshot, + int nkeys, ScanKey key) +{ + return heap_beginscan_internal(relation, snapshot, nkeys, key, true); +} + +static HeapScanDesc +heap_beginscan_internal(Relation relation, Snapshot snapshot, + int nkeys, ScanKey key, bool is_bitmapscan) +{ HeapScanDesc scan; /* @@ -1062,6 +1089,7 @@ heap_beginscan(Relation relation, Snapshot snapshot, scan->rs_rd = relation; scan->rs_snapshot = snapshot; scan->rs_nkeys = nkeys; + scan->rs_bitmapscan = is_bitmapscan; scan->rs_strategy = NULL; /* set in initscan */ /* diff --git a/src/backend/executor/nodeBitmapHeapscan.c b/src/backend/executor/nodeBitmapHeapscan.c index 07729da2be6..c2ae755e014 100644 --- a/src/backend/executor/nodeBitmapHeapscan.c +++ b/src/backend/executor/nodeBitmapHeapscan.c @@ -21,7 +21,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/executor/nodeBitmapHeapscan.c,v 1.17 2007/05/27 03:50:39 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/executor/nodeBitmapHeapscan.c,v 1.18 2007/06/09 18:49:55 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -388,9 +388,6 @@ ExecBitmapHeapReScan(BitmapHeapScanState *node, ExprContext *exprCtxt) /* rescan to release any page pin */ heap_rescan(node->ss.ss_currentScanDesc, NULL); - /* undo bogus "seq scan" count (see notes in ExecInitBitmapHeapScan) */ - pgstat_discount_heap_scan(node->ss.ss_currentScanDesc->rs_rd); - if (node->tbm) tbm_free(node->tbm); node->tbm = NULL; @@ -522,20 +519,12 @@ ExecInitBitmapHeapScan(BitmapHeapScan *node, EState *estate, int eflags) /* * Even though we aren't going to do a conventional seqscan, it is useful - * to create a HeapScanDesc --- this checks the relation size and sets up - * statistical infrastructure for us. - */ - scanstate->ss.ss_currentScanDesc = heap_beginscan(currentRelation, - estate->es_snapshot, - 0, - NULL); - - /* - * One problem is that heap_beginscan counts a "sequential scan" start, - * when we actually aren't doing any such thing. Reverse out the added - * scan count. (Eventually we may want to count bitmap scans separately.) + * to create a HeapScanDesc --- most of the fields in it are usable. */ - pgstat_discount_heap_scan(scanstate->ss.ss_currentScanDesc->rs_rd); + scanstate->ss.ss_currentScanDesc = heap_beginscan_bm(currentRelation, + estate->es_snapshot, + 0, + NULL); /* * get the scan type from the relation descriptor. |