mirror of
https://github.com/postgres/postgres.git
synced 2026-05-19 07:03:27 -04:00
5262f7a4fc
In combination with 569174f1be, which
taught the btree AM how to perform parallel index scans, this allows
parallel index scan plans on btree indexes. This infrastructure
should be general enough to support parallel index scans for other
index AMs as well, if someone updates them to support parallel
scans.
Amit Kapila, reviewed and tested by Anastasia Lubennikova, Tushar
Ahuja, and Haribabu Kommi, and me.
71 lines
2.1 KiB
PL/PgSQL
71 lines
2.1 KiB
PL/PgSQL
--
|
|
-- PARALLEL
|
|
--
|
|
|
|
create or replace function parallel_restricted(int) returns int as
|
|
$$begin return $1; end$$ language plpgsql parallel restricted;
|
|
|
|
-- Serializable isolation would disable parallel query, so explicitly use an
|
|
-- arbitrary other level.
|
|
begin isolation level repeatable read;
|
|
|
|
-- encourage use of parallel plans
|
|
set parallel_setup_cost=0;
|
|
set parallel_tuple_cost=0;
|
|
set min_parallel_table_scan_size=0;
|
|
set max_parallel_workers_per_gather=4;
|
|
|
|
explain (costs off)
|
|
select count(*) from a_star;
|
|
select count(*) from a_star;
|
|
|
|
-- test that parallel_restricted function doesn't run in worker
|
|
alter table tenk1 set (parallel_workers = 4);
|
|
explain (verbose, costs off)
|
|
select parallel_restricted(unique1) from tenk1
|
|
where stringu1 = 'GRAAAA' order by 1;
|
|
|
|
-- test parallel plan when group by expression is in target list.
|
|
explain (costs off)
|
|
select length(stringu1) from tenk1 group by length(stringu1);
|
|
select length(stringu1) from tenk1 group by length(stringu1);
|
|
|
|
explain (costs off)
|
|
select stringu1, count(*) from tenk1 group by stringu1 order by stringu1;
|
|
|
|
-- test that parallel plan for aggregates is not selected when
|
|
-- target list contains parallel restricted clause.
|
|
explain (costs off)
|
|
select sum(parallel_restricted(unique1)) from tenk1
|
|
group by(parallel_restricted(unique1));
|
|
|
|
-- test parallel plans for queries containing un-correlated subplans.
|
|
alter table tenk2 set (parallel_workers = 0);
|
|
explain (costs off)
|
|
select count(*) from tenk1 where (two, four) not in
|
|
(select hundred, thousand from tenk2 where thousand > 100);
|
|
select count(*) from tenk1 where (two, four) not in
|
|
(select hundred, thousand from tenk2 where thousand > 100);
|
|
alter table tenk2 reset (parallel_workers);
|
|
|
|
-- test parallel index scans.
|
|
set enable_seqscan to off;
|
|
set enable_bitmapscan to off;
|
|
|
|
explain (costs off)
|
|
select count((unique1)) from tenk1 where hundred > 1;
|
|
select count((unique1)) from tenk1 where hundred > 1;
|
|
|
|
reset enable_seqscan;
|
|
reset enable_bitmapscan;
|
|
|
|
set force_parallel_mode=1;
|
|
|
|
explain (costs off)
|
|
select stringu1::int2 from tenk1 where unique1 = 1;
|
|
|
|
-- provoke error in worker
|
|
select stringu1::int2 from tenk1 where unique1 = 1;
|
|
|
|
rollback;
|