From a7d615c3b1ace65b68fd03561e0bf7cdd67843f8 Mon Sep 17 00:00:00 2001 From: zhaosen Date: Tue, 30 Jul 2024 09:49:54 +0800 Subject: [PATCH] parallel bitmap scan test case --- .../input/parallel_bitmap_heapscan.source | 43 ++++++ .../output/parallel_bitmap_heapscan.source | 145 ++++++++++++++++++ 2 files changed, 188 insertions(+) create mode 100644 src/test/regress/input/parallel_bitmap_heapscan.source create mode 100644 src/test/regress/output/parallel_bitmap_heapscan.source diff --git a/src/test/regress/input/parallel_bitmap_heapscan.source b/src/test/regress/input/parallel_bitmap_heapscan.source new file mode 100644 index 0000000000..2697939dd2 --- /dev/null +++ b/src/test/regress/input/parallel_bitmap_heapscan.source @@ -0,0 +1,43 @@ +drop schema if exists test_parallel_bitmap_heapscan cascade; +create schema test_parallel_bitmap_heapscan; +set current_schema='test_parallel_bitmap_heapscan'; +-- create test table and index +DROP TABLE IF EXISTS parallel_bitmapindex_01; +DROP TABLE IF EXISTS parallel_bitmapindex_02; +CREATE TABLE parallel_bitmapindex_01(a int, b int); +INSERT INTO parallel_bitmapindex_01 VALUES (generate_series(1, 1000000), generate_series(1,1000000)); +CREATE INDEX index_parallel_bitmapindex_01 ON parallel_bitmapindex_01(a); +CREATE TABLE parallel_bitmapindex_02(a int, b int); +INSERT INTO parallel_bitmapindex_02 VALUES (generate_series(1,10), generate_series(1,10)); +SET enable_seqscan = OFF; +SET enable_indexscan = OFF; +SET enable_indexonlyscan = OFF; +SET enable_nestloop = OFF; +SET query_dop = 2; +-- encourage optimizer to choose parallel path +SET smp_thread_cost = 0; + +-- parallel bitmap heap scan in equality case +SELECT * FROM parallel_bitmapindex_01 WHERE a=100; +SELECT * FROM parallel_bitmapindex_01 WHERE a=100 AND a=10000; +SELECT * FROM parallel_bitmapindex_01 WHERE a=100 AND b=100; +SELECT * FROM parallel_bitmapindex_01 WHERE a=100 AND b=200; + +-- parallel bitmap heap in scope case +EXPLAIN (COSTS OFF) SELECT COUNT(b) FROM parallel_bitmapindex_01 WHERE a<10000; +SELECT COUNT(b) FROM parallel_bitmapindex_01 WHERE a<10000; +EXPLAIN (COSTS OFF) SELECT COUNT(b) FROM parallel_bitmapindex_01 WHERE a>10000 AND a<20000; +SELECT COUNT(b) FROM parallel_bitmapindex_01 WHERE a>10000 AND a<20000; +EXPLAIN (COSTS OFF) SELECT * FROM parallel_bitmapindex_01 WHERE a in (1000,10000,100000) ORDER BY a; +SELECT * FROM parallel_bitmapindex_01 WHERE a in (1000,10000,100000) ORDER BY a; +EXPLAIN (COSTS OFF) SELECT * FROM parallel_bitmapindex_01 JOIN parallel_bitmapindex_02 ON parallel_bitmapindex_01.a<100 and parallel_bitmapindex_01.a=parallel_bitmapindex_02.a ORDER BY parallel_bitmapindex_01.a; +SELECT * FROM parallel_bitmapindex_01 JOIN parallel_bitmapindex_02 ON parallel_bitmapindex_01.a<100 and parallel_bitmapindex_01.a=parallel_bitmapindex_02.a ORDER BY parallel_bitmapindex_01.a; + +--cleanup env +DROP SCHEMA test_parallel_bitmap_heapscan CASCADE; +RESET enable_seqscan; +RESET enable_indexscan; +RESET enable_indexonlyscan; +RESET query_dop; +RESET smp_thread_cost; +RESET enable_nestloop; diff --git a/src/test/regress/output/parallel_bitmap_heapscan.source b/src/test/regress/output/parallel_bitmap_heapscan.source new file mode 100644 index 0000000000..4f0994727b --- /dev/null +++ b/src/test/regress/output/parallel_bitmap_heapscan.source @@ -0,0 +1,145 @@ +drop schema if exists test_parallel_bitmap_heapscan cascade; +NOTICE: schema "test_parallel_bitmap_heapscan" does not exist, skipping +create schema test_parallel_bitmap_heapscan; +set current_schema='test_parallel_bitmap_heapscan'; +-- create test table and index +DROP TABLE IF EXISTS parallel_bitmapindex_01; +NOTICE: table "parallel_bitmapindex_01" does not exist, skipping +DROP TABLE IF EXISTS parallel_bitmapindex_02; +NOTICE: table "parallel_bitmapindex_02" does not exist, skipping +CREATE TABLE parallel_bitmapindex_01(a int, b int); +INSERT INTO parallel_bitmapindex_01 VALUES (generate_series(1, 1000000), generate_series(1,1000000)); +CREATE INDEX index_parallel_bitmapindex_01 ON parallel_bitmapindex_01(a); +CREATE TABLE parallel_bitmapindex_02(a int, b int); +INSERT INTO parallel_bitmapindex_02 VALUES (generate_series(1,10), generate_series(1,10)); +SET enable_seqscan = OFF; +SET enable_indexscan = OFF; +SET enable_indexonlyscan = OFF; +SET enable_nestloop = OFF; +SET query_dop = 2; +-- encourage optimizer to choose parallel path +SET smp_thread_cost = 0; +-- parallel bitmap heap scan in equality case +SELECT * FROM parallel_bitmapindex_01 WHERE a=100; + a | b +-----+----- + 100 | 100 +(1 row) + +SELECT * FROM parallel_bitmapindex_01 WHERE a=100 AND a=10000; + a | b +---+--- +(0 rows) + +SELECT * FROM parallel_bitmapindex_01 WHERE a=100 AND b=100; + a | b +-----+----- + 100 | 100 +(1 row) + +SELECT * FROM parallel_bitmapindex_01 WHERE a=100 AND b=200; + a | b +---+--- +(0 rows) + +-- parallel bitmap heap in scope case +EXPLAIN (COSTS OFF) SELECT COUNT(b) FROM parallel_bitmapindex_01 WHERE a<10000; + QUERY PLAN +---------------------------------------------------------------------------- + Aggregate + -> Streaming(type: LOCAL GATHER dop: 1/2) + -> Aggregate + -> Bitmap Heap Scan on parallel_bitmapindex_01 + Recheck Cond: (a < 10000) + -> Bitmap Index Scan on index_parallel_bitmapindex_01 + Index Cond: (a < 10000) +(7 rows) + +SELECT COUNT(b) FROM parallel_bitmapindex_01 WHERE a<10000; + count +------- + 9999 +(1 row) + +EXPLAIN (COSTS OFF) SELECT COUNT(b) FROM parallel_bitmapindex_01 WHERE a>10000 AND a<20000; + QUERY PLAN +---------------------------------------------------------------------------- + Aggregate + -> Streaming(type: LOCAL GATHER dop: 1/2) + -> Aggregate + -> Bitmap Heap Scan on parallel_bitmapindex_01 + Recheck Cond: ((a > 10000) AND (a < 20000)) + -> Bitmap Index Scan on index_parallel_bitmapindex_01 + Index Cond: ((a > 10000) AND (a < 20000)) +(7 rows) + +SELECT COUNT(b) FROM parallel_bitmapindex_01 WHERE a>10000 AND a<20000; + count +------- + 9999 +(1 row) + +EXPLAIN (COSTS OFF) SELECT * FROM parallel_bitmapindex_01 WHERE a in (1000,10000,100000) ORDER BY a; + QUERY PLAN +------------------------------------------------------------------------------ + Sort + Sort Key: a + -> Streaming(type: LOCAL GATHER dop: 1/2) + -> Bitmap Heap Scan on parallel_bitmapindex_01 + Recheck Cond: (a = ANY ('{1000,10000,100000}'::integer[])) + -> Bitmap Index Scan on index_parallel_bitmapindex_01 + Index Cond: (a = ANY ('{1000,10000,100000}'::integer[])) +(7 rows) + +SELECT * FROM parallel_bitmapindex_01 WHERE a in (1000,10000,100000) ORDER BY a; + a | b +--------+-------- + 1000 | 1000 + 10000 | 10000 + 100000 | 100000 +(3 rows) + +EXPLAIN (COSTS OFF) SELECT * FROM parallel_bitmapindex_01 JOIN parallel_bitmapindex_02 ON parallel_bitmapindex_01.a<100 and parallel_bitmapindex_01.a=parallel_bitmapindex_02.a ORDER BY parallel_bitmapindex_01.a; + QUERY PLAN +---------------------------------------------------------------------------------- + Sort + Sort Key: parallel_bitmapindex_01.a + -> Streaming(type: LOCAL GATHER dop: 1/2) + -> Hash Join + Hash Cond: (parallel_bitmapindex_02.a = parallel_bitmapindex_01.a) + -> Streaming(type: BROADCAST dop: 2/2) + -> Seq Scan on parallel_bitmapindex_02 + Filter: (a < 100) + -> Hash + -> Bitmap Heap Scan on parallel_bitmapindex_01 + Recheck Cond: (a < 100) + -> Bitmap Index Scan on index_parallel_bitmapindex_01 + Index Cond: (a < 100) +(13 rows) + +SELECT * FROM parallel_bitmapindex_01 JOIN parallel_bitmapindex_02 ON parallel_bitmapindex_01.a<100 and parallel_bitmapindex_01.a=parallel_bitmapindex_02.a ORDER BY parallel_bitmapindex_01.a; + a | b | a | b +----+----+----+---- + 1 | 1 | 1 | 1 + 2 | 2 | 2 | 2 + 3 | 3 | 3 | 3 + 4 | 4 | 4 | 4 + 5 | 5 | 5 | 5 + 6 | 6 | 6 | 6 + 7 | 7 | 7 | 7 + 8 | 8 | 8 | 8 + 9 | 9 | 9 | 9 + 10 | 10 | 10 | 10 +(10 rows) + +--cleanup env +DROP SCHEMA test_parallel_bitmap_heapscan CASCADE; +NOTICE: drop cascades to 2 other objects +DETAIL: drop cascades to table parallel_bitmapindex_01 +drop cascades to table parallel_bitmapindex_02 +RESET enable_seqscan; +RESET enable_indexscan; +RESET enable_indexonlyscan; +RESET query_dop; +RESET smp_thread_cost; +RESET enable_nestloop; -- Gitee