diff --git a/src/gausskernel/runtime/executor/nodeBitmapHeapscan.cpp b/src/gausskernel/runtime/executor/nodeBitmapHeapscan.cpp index cf028dbd2..c26ae5c5e 100644 --- a/src/gausskernel/runtime/executor/nodeBitmapHeapscan.cpp +++ b/src/gausskernel/runtime/executor/nodeBitmapHeapscan.cpp @@ -1303,10 +1303,10 @@ void BitmapHeapPrefetchNext( Oid oldOid = GPIGetCurrPartOid(node->gpi_scan); int2 oldBktId = cbi_get_current_bucketid(node->cbi_scan); Relation oldheap = NULL; + Relation prefetchRel = scan->rs_rd; while (node->prefetch_pages < node->prefetch_target) { TBMIterateResult* tbmpre = tbm_iterate(*prefetch_iterator); - Relation prefetchRel = scan->rs_rd; hpscan = (tbm_is_crossbucket(node->tbm) ? (HBktTblScanDesc)node->ss.ss_currentScanDesc : NULL); if (tbmpre == NULL) { diff --git a/src/test/regress/expected/gpi_bitmapscan_prefetch.out b/src/test/regress/expected/gpi_bitmapscan_prefetch.out new file mode 100644 index 000000000..84b1329ef --- /dev/null +++ b/src/test/regress/expected/gpi_bitmapscan_prefetch.out @@ -0,0 +1,65 @@ +create schema gpi_bitmapscan_prefetch; +set search_path to gpi_bitmapscan_prefetch; + +CREATE TABLE gpi_bitmap_table1 +( + c1 int, + c2 int, + c3 int, + c4 text +) +partition by range (c1) +( + partition p0_gpi_bitmap_table1 VALUES less than (100), + partition p1_gpi_bitmap_table1 VALUES less than (200) +); + +INSERT INTO gpi_bitmap_table1 + SELECT 50, 70, 50, md5(random()::text) + FROM generate_series(1,1) r; + +INSERT INTO gpi_bitmap_table1 + SELECT 50, 80, 50, md5(random()::text) + FROM generate_series(1,200) r; + +INSERT INTO gpi_bitmap_table1 + SELECT 50, 70, 50, md5(random()::text) + FROM generate_series(1,1) r; + +INSERT INTO gpi_bitmap_table1 + SELECT 150, 50, 150, 'explain analyze SELECT * FROM gpi_bitmap_table1 WHERE c2 = 70;explain analyze SELECT * FROM gpi_bitmap_table1 WHERE c2 = 70;explain analyze SELECT * FROM gpi_bitmap_table1 WHERE c2 = 70;explain analyze SELECT * FROM gpi_bitmap_table1 WHERE c2 = 70;explain analyze SELECT * FROM gpi_bitmap_table1 WHERE c2 = 70;explain analyze SELECT * FROM gpi_bitmap_table1 WHERE c2 = 70;explain analyze SELECT * FROM gpi_bitmap_table1 WHERE c2 = 70;explain analyze SELECT * FROM gpi_bitmap_table1 WHERE c2 = 70;explain analyze SELECT * FROM gpi_bitmap_table1 WHERE c2 = 70;explain analyze SELECT * FROM gpi_bitmap_table1 WHERE c2 = 70;explain analyze SELECT * FROM gpi_bitmap_table1 WHERE c2 = 70;explain analyze SELECT * FROM gpi_bitmap_table1 WHERE c2 = 70;explain analyze SELECT * FROM gpi_bitmap_table1 WHERE c2 = 70;explain analyze SELECT * FROM gpi_bitmap_table1 WHERE c2 = 70;explain analyze SELECT * FROM gpi_bitmap_table1 WHERE c2 = 70;explain analyze SELECT * FROM gpi_bitmap_table1 WHERE c2 = 70;explain analyze SELECT * FROM gpi_bitmap_table1 WHERE c2 = 70;explain analyze SELECT * FROM gpi_bitmap_table1 WHERE c2 = 70;explain analyze SELECT * FROM gpi_bitmap_table1 WHERE c2 = 70;explain analyze SELECT * FROM gpi_bitmap_table1 WHERE c2 = 70;explain analyze SELECT * FROM gpi_bitmap_table1 WHERE c2 = 70;explain analyze SELECT * FROM gpi_bitmap_table1 WHERE c2 = 70;' + FROM generate_series(1,800000) r; + +INSERT INTO gpi_bitmap_table1 + SELECT 150, 70, 150, md5(random()::text) + FROM generate_series(1,1) r; + +INSERT INTO gpi_bitmap_table1 + SELECT 150, 80, 150, md5(random()::text) + FROM generate_series(2,100) r; + +INSERT INTO gpi_bitmap_table1 + SELECT 150, 70, 150, md5(random()::text) + FROM generate_series(1,1) r; + +SET maintenance_work_mem = '1GB'; +CREATE INDEX idx2_gpi_bitmap_table1 ON gpi_bitmap_table1 (c2) GLOBAL; +RESET maintenance_work_mem; + +SET effective_io_concurrency = 200; +SET enable_seqscan = off; +SET enable_indexscan = off; +SELECT c2 FROM gpi_bitmap_table1 WHERE c2 = 70; + c2 +---- + 70 + 70 + 70 + 70 +(4 rows) + +RESET effective_io_concurrency; +RESET enable_seqscan; +RESET enable_indexscan; +drop schema gpi_bitmapscan_prefetch cascade; +NOTICE: drop cascades to table gpi_bitmap_table1 diff --git a/src/test/regress/parallel_schedule0 b/src/test/regress/parallel_schedule0 index baf5e7410..58610d679 100644 --- a/src/test/regress/parallel_schedule0 +++ b/src/test/regress/parallel_schedule0 @@ -346,7 +346,7 @@ test: gpi_index test: gpi_index_only # gpi bitmap -test: gpi_bitmapscan +test: gpi_bitmapscan gpi_bitmapscan_prefetch # gpi pwj test: gpi_pwj diff --git a/src/test/regress/sql/gpi_bitmapscan_prefetch.sql b/src/test/regress/sql/gpi_bitmapscan_prefetch.sql new file mode 100644 index 000000000..ae6a6e73f --- /dev/null +++ b/src/test/regress/sql/gpi_bitmapscan_prefetch.sql @@ -0,0 +1,56 @@ +create schema gpi_bitmapscan_prefetch; +set search_path to gpi_bitmapscan_prefetch; + +CREATE TABLE gpi_bitmap_table1 +( + c1 int, + c2 int, + c3 int, + c4 text +) +partition by range (c1) +( + partition p0_gpi_bitmap_table1 VALUES less than (100), + partition p1_gpi_bitmap_table1 VALUES less than (200) +); + +INSERT INTO gpi_bitmap_table1 + SELECT 50, 70, 50, md5(random()::text) + FROM generate_series(1,1) r; + +INSERT INTO gpi_bitmap_table1 + SELECT 50, 80, 50, md5(random()::text) + FROM generate_series(1,200) r; + +INSERT INTO gpi_bitmap_table1 + SELECT 50, 70, 50, md5(random()::text) + FROM generate_series(1,1) r; + +INSERT INTO gpi_bitmap_table1 + SELECT 150, 50, 150, 'explain analyze SELECT * FROM gpi_bitmap_table1 WHERE c2 = 70;explain analyze SELECT * FROM gpi_bitmap_table1 WHERE c2 = 70;explain analyze SELECT * FROM gpi_bitmap_table1 WHERE c2 = 70;explain analyze SELECT * FROM gpi_bitmap_table1 WHERE c2 = 70;explain analyze SELECT * FROM gpi_bitmap_table1 WHERE c2 = 70;explain analyze SELECT * FROM gpi_bitmap_table1 WHERE c2 = 70;explain analyze SELECT * FROM gpi_bitmap_table1 WHERE c2 = 70;explain analyze SELECT * FROM gpi_bitmap_table1 WHERE c2 = 70;explain analyze SELECT * FROM gpi_bitmap_table1 WHERE c2 = 70;explain analyze SELECT * FROM gpi_bitmap_table1 WHERE c2 = 70;explain analyze SELECT * FROM gpi_bitmap_table1 WHERE c2 = 70;explain analyze SELECT * FROM gpi_bitmap_table1 WHERE c2 = 70;explain analyze SELECT * FROM gpi_bitmap_table1 WHERE c2 = 70;explain analyze SELECT * FROM gpi_bitmap_table1 WHERE c2 = 70;explain analyze SELECT * FROM gpi_bitmap_table1 WHERE c2 = 70;explain analyze SELECT * FROM gpi_bitmap_table1 WHERE c2 = 70;explain analyze SELECT * FROM gpi_bitmap_table1 WHERE c2 = 70;explain analyze SELECT * FROM gpi_bitmap_table1 WHERE c2 = 70;explain analyze SELECT * FROM gpi_bitmap_table1 WHERE c2 = 70;explain analyze SELECT * FROM gpi_bitmap_table1 WHERE c2 = 70;explain analyze SELECT * FROM gpi_bitmap_table1 WHERE c2 = 70;explain analyze SELECT * FROM gpi_bitmap_table1 WHERE c2 = 70;' + FROM generate_series(1,800000) r; + +INSERT INTO gpi_bitmap_table1 + SELECT 150, 70, 150, md5(random()::text) + FROM generate_series(1,1) r; + +INSERT INTO gpi_bitmap_table1 + SELECT 150, 80, 150, md5(random()::text) + FROM generate_series(2,100) r; + +INSERT INTO gpi_bitmap_table1 + SELECT 150, 70, 150, md5(random()::text) + FROM generate_series(1,1) r; + +SET maintenance_work_mem = '1GB'; +CREATE INDEX idx2_gpi_bitmap_table1 ON gpi_bitmap_table1 (c2) GLOBAL; +RESET maintenance_work_mem; + +SET effective_io_concurrency = 200; +SET enable_seqscan = off; +SET enable_indexscan = off; +SELECT c2 FROM gpi_bitmap_table1 WHERE c2 = 70; +RESET effective_io_concurrency; +RESET enable_seqscan; +RESET enable_indexscan; +drop schema gpi_bitmapscan_prefetch cascade;