mlpartjoin.sql

application/octet-stream

Filename: mlpartjoin.sql
Type: application/octet-stream
Part: 0
Message: Re: Partition-wise join for join between (declaratively) partitioned tables
drop table foo, bar, baz;

create table foo (a int, b numeric, c text) partition by list (a);
create table foo1 partition of foo for values in (1) partition by range (b);
create table foo2 partition of foo for values in (2) partition by range (b);
create table foo3 partition of foo for values in (3) partition by range (b);
create table foo1a partition of foo1 for values from (0) to (1000);
create table foo1b partition of foo1 for values from (1000) to (2000);
create table foo2a partition of foo2 for values from (0) to (1000);
create table foo2b partition of foo2 for values from (1000) to (2000);
create table foo3a partition of foo3 for values from (0) to (1000);
create table foo3b partition of foo3 for values from (1000) to (2000);

create table bar (a int, b numeric, c text) partition by list (a);
create table bar1 partition of bar for values in (1);
create table bar2 partition of bar for values in (2) partition by range (b);
create table bar2a partition of bar2 for values from (0) to (1000);
create table bar2b partition of bar2 for values from (1000) to (2000);
create table bar3 partition of bar for values in (3) partition by range (b);
create table bar3a partition of bar3 for values from (0) to (1000);
create table bar3b partition of bar3 for values from (1000) to (2000);

create table baz (a int, b numeric, c text) partition by list (a);
create table baz1 partition of baz for values in (1);
create table baz2 partition of baz for values in (2);
create table baz3 partition of baz for values in (3) partition by range (b);
create table baz3a partition of baz3 for values from (0) to (1000);
create table baz3b partition of baz3 for values from (1000) to (2000);

insert into foo
  select k, l, k || ' ' || l
  from generate_series(1, 3) k, generate_series(0, 1999) l;

insert into bar
  select k, l, k || ' ' || l || ' ' || m
  from generate_series(1, 3) k, generate_series(0, 1999) l, generate_series(1, 2) m;

insert into baz
  select k, l, k || ' ' || l || ' ' || m
  from generate_series(1, 3) k, generate_series(0, 1999) l, generate_series(1, 3) m;

analyze foo;
analyze bar;
analyze baz;

set enable_partition_wise_join = true;
explain select * from foo
    join bar on foo.a = bar.a and foo.b = bar.b
    left join baz on foo.a = baz.a and foo.b = baz.b;