修复effective_io_concurrency取值大于1时分区表全局索引BitmapHeapscan报错的问题。

This commit is contained in:
April01xxx
2023-10-23 17:24:30 +08:00
committed by zhang_xubo
parent 467977243b
commit e2a141d881
4 changed files with 123 additions and 2 deletions

View File

@ -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) {

View File

@ -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

View File

@ -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

View File

@ -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;