mirror of https://github.com/citusdata/citus.git
364 lines
10 KiB
Plaintext
364 lines
10 KiB
Plaintext
CREATE TABLE parent(ts timestamptz, i int, n numeric, s text)
|
|
PARTITION BY RANGE (ts);
|
|
-- row partitions
|
|
CREATE TABLE p0 PARTITION OF parent
|
|
FOR VALUES FROM ('2020-01-01') TO ('2020-02-01');
|
|
CREATE TABLE p1 PARTITION OF parent
|
|
FOR VALUES FROM ('2020-02-01') TO ('2020-03-01');
|
|
CREATE TABLE p2 PARTITION OF parent
|
|
FOR VALUES FROM ('2020-03-01') TO ('2020-04-01');
|
|
CREATE TABLE p3 PARTITION OF parent
|
|
FOR VALUES FROM ('2020-04-01') TO ('2020-05-01');
|
|
INSERT INTO parent SELECT '2020-01-15', 10, 100, 'one thousand'
|
|
FROM generate_series(1,100000);
|
|
INSERT INTO parent SELECT '2020-02-15', 20, 200, 'two thousand'
|
|
FROM generate_series(1,100000);
|
|
INSERT INTO parent SELECT '2020-03-15', 30, 300, 'three thousand'
|
|
FROM generate_series(1,100000);
|
|
INSERT INTO parent SELECT '2020-04-15', 30, 300, 'three thousand'
|
|
FROM generate_series(1,100000);
|
|
-- run parallel plans
|
|
SET force_parallel_mode = regress;
|
|
SET min_parallel_table_scan_size = 1;
|
|
SET parallel_tuple_cost = 0;
|
|
SET max_parallel_workers = 4;
|
|
SET max_parallel_workers_per_gather = 4;
|
|
EXPLAIN (costs off) SELECT count(*), sum(i), min(i), max(i) FROM parent;
|
|
QUERY PLAN
|
|
---------------------------------------------------------------------
|
|
Finalize Aggregate
|
|
-> Gather
|
|
Workers Planned: 4
|
|
-> Partial Aggregate
|
|
-> Parallel Append
|
|
-> Parallel Seq Scan on p0
|
|
-> Parallel Seq Scan on p1
|
|
-> Parallel Seq Scan on p2
|
|
-> Parallel Seq Scan on p3
|
|
(9 rows)
|
|
|
|
SELECT count(*), sum(i), min(i), max(i) FROM parent;
|
|
count | sum | min | max
|
|
---------------------------------------------------------------------
|
|
400000 | 9000000 | 10 | 30
|
|
(1 row)
|
|
|
|
-- set older partitions as columnar
|
|
SELECT alter_table_set_access_method('p0','columnar');
|
|
NOTICE: creating a new table for public.p0
|
|
NOTICE: Moving the data of public.p0
|
|
NOTICE: Dropping the old public.p0
|
|
NOTICE: Renaming the new table to public.p0
|
|
alter_table_set_access_method
|
|
---------------------------------------------------------------------
|
|
|
|
(1 row)
|
|
|
|
SELECT alter_table_set_access_method('p1','columnar');
|
|
NOTICE: creating a new table for public.p1
|
|
NOTICE: Moving the data of public.p1
|
|
NOTICE: Dropping the old public.p1
|
|
NOTICE: Renaming the new table to public.p1
|
|
alter_table_set_access_method
|
|
---------------------------------------------------------------------
|
|
|
|
(1 row)
|
|
|
|
SELECT alter_table_set_access_method('p3','columnar');
|
|
NOTICE: creating a new table for public.p3
|
|
NOTICE: Moving the data of public.p3
|
|
NOTICE: Dropping the old public.p3
|
|
NOTICE: Renaming the new table to public.p3
|
|
alter_table_set_access_method
|
|
---------------------------------------------------------------------
|
|
|
|
(1 row)
|
|
|
|
-- should also be parallel plan
|
|
EXPLAIN (costs off) SELECT count(*), sum(i), min(i), max(i) FROM parent;
|
|
QUERY PLAN
|
|
---------------------------------------------------------------------
|
|
Finalize Aggregate
|
|
-> Gather
|
|
Workers Planned: 4
|
|
-> Partial Aggregate
|
|
-> Parallel Append
|
|
-> Custom Scan (ColumnarScan) on p3
|
|
-> Custom Scan (ColumnarScan) on p0
|
|
-> Custom Scan (ColumnarScan) on p1
|
|
-> Parallel Seq Scan on p2
|
|
(9 rows)
|
|
|
|
SELECT count(*), sum(i), min(i), max(i) FROM parent;
|
|
count | sum | min | max
|
|
---------------------------------------------------------------------
|
|
400000 | 9000000 | 10 | 30
|
|
(1 row)
|
|
|
|
-- and also parallel without custom scan
|
|
SET columnar.enable_custom_scan = FALSE;
|
|
EXPLAIN (costs off) SELECT count(*), sum(i), min(i), max(i) FROM parent;
|
|
QUERY PLAN
|
|
---------------------------------------------------------------------
|
|
Finalize Aggregate
|
|
-> Gather
|
|
Workers Planned: 4
|
|
-> Partial Aggregate
|
|
-> Parallel Append
|
|
-> Seq Scan on p0
|
|
-> Seq Scan on p1
|
|
-> Seq Scan on p3
|
|
-> Parallel Seq Scan on p2
|
|
(9 rows)
|
|
|
|
SELECT count(*), sum(i), min(i), max(i) FROM parent;
|
|
count | sum | min | max
|
|
---------------------------------------------------------------------
|
|
400000 | 9000000 | 10 | 30
|
|
(1 row)
|
|
|
|
SET columnar.enable_custom_scan TO DEFAULT;
|
|
SET force_parallel_mode TO DEFAULT;
|
|
SET min_parallel_table_scan_size TO DEFAULT;
|
|
SET parallel_tuple_cost TO DEFAULT;
|
|
SET max_parallel_workers TO DEFAULT;
|
|
SET max_parallel_workers_per_gather TO DEFAULT;
|
|
DROP TABLE parent;
|
|
--
|
|
-- Test inheritance
|
|
--
|
|
CREATE TABLE i_row(i int);
|
|
INSERT INTO i_row VALUES(100);
|
|
CREATE TABLE i_col(i int) USING columnar;
|
|
INSERT INTO i_col VALUES(200);
|
|
CREATE TABLE ij_row_row(j int) INHERITS(i_row);
|
|
INSERT INTO ij_row_row VALUES(300, 1000);
|
|
CREATE TABLE ij_row_col(j int) INHERITS(i_row) USING columnar;
|
|
INSERT INTO ij_row_col VALUES(400, 2000);
|
|
CREATE TABLE ij_col_row(j int) INHERITS(i_col);
|
|
INSERT INTO ij_col_row VALUES(500, 3000);
|
|
CREATE TABLE ij_col_col(j int) INHERITS(i_col) USING columnar;
|
|
INSERT INTO ij_col_col VALUES(600, 4000);
|
|
EXPLAIN (costs off) SELECT * FROM i_row;
|
|
QUERY PLAN
|
|
---------------------------------------------------------------------
|
|
Append
|
|
-> Seq Scan on i_row
|
|
-> Seq Scan on ij_row_row
|
|
-> Custom Scan (ColumnarScan) on ij_row_col
|
|
(4 rows)
|
|
|
|
SELECT * FROM i_row;
|
|
i
|
|
---------------------------------------------------------------------
|
|
100
|
|
300
|
|
400
|
|
(3 rows)
|
|
|
|
EXPLAIN (costs off) SELECT * FROM ONLY i_row;
|
|
QUERY PLAN
|
|
---------------------------------------------------------------------
|
|
Seq Scan on i_row
|
|
(1 row)
|
|
|
|
SELECT * FROM ONLY i_row;
|
|
i
|
|
---------------------------------------------------------------------
|
|
100
|
|
(1 row)
|
|
|
|
EXPLAIN (costs off) SELECT * FROM i_col;
|
|
QUERY PLAN
|
|
---------------------------------------------------------------------
|
|
Append
|
|
-> Custom Scan (ColumnarScan) on i_col
|
|
-> Seq Scan on ij_col_row
|
|
-> Custom Scan (ColumnarScan) on ij_col_col
|
|
(4 rows)
|
|
|
|
SELECT * FROM i_col;
|
|
i
|
|
---------------------------------------------------------------------
|
|
200
|
|
500
|
|
600
|
|
(3 rows)
|
|
|
|
EXPLAIN (costs off) SELECT * FROM ONLY i_col;
|
|
QUERY PLAN
|
|
---------------------------------------------------------------------
|
|
Custom Scan (ColumnarScan) on i_col
|
|
(1 row)
|
|
|
|
SELECT * FROM ONLY i_col;
|
|
i
|
|
---------------------------------------------------------------------
|
|
200
|
|
(1 row)
|
|
|
|
EXPLAIN (costs off) SELECT * FROM ij_row_row;
|
|
QUERY PLAN
|
|
---------------------------------------------------------------------
|
|
Seq Scan on ij_row_row
|
|
(1 row)
|
|
|
|
SELECT * FROM ij_row_row;
|
|
i | j
|
|
---------------------------------------------------------------------
|
|
300 | 1000
|
|
(1 row)
|
|
|
|
EXPLAIN (costs off) SELECT * FROM ij_row_col;
|
|
QUERY PLAN
|
|
---------------------------------------------------------------------
|
|
Custom Scan (ColumnarScan) on ij_row_col
|
|
(1 row)
|
|
|
|
SELECT * FROM ij_row_col;
|
|
i | j
|
|
---------------------------------------------------------------------
|
|
400 | 2000
|
|
(1 row)
|
|
|
|
EXPLAIN (costs off) SELECT * FROM ij_col_row;
|
|
QUERY PLAN
|
|
---------------------------------------------------------------------
|
|
Seq Scan on ij_col_row
|
|
(1 row)
|
|
|
|
SELECT * FROM ij_col_row;
|
|
i | j
|
|
---------------------------------------------------------------------
|
|
500 | 3000
|
|
(1 row)
|
|
|
|
EXPLAIN (costs off) SELECT * FROM ij_col_col;
|
|
QUERY PLAN
|
|
---------------------------------------------------------------------
|
|
Custom Scan (ColumnarScan) on ij_col_col
|
|
(1 row)
|
|
|
|
SELECT * FROM ij_col_col;
|
|
i | j
|
|
---------------------------------------------------------------------
|
|
600 | 4000
|
|
(1 row)
|
|
|
|
SET columnar.enable_custom_scan = FALSE;
|
|
EXPLAIN (costs off) SELECT * FROM i_row;
|
|
QUERY PLAN
|
|
---------------------------------------------------------------------
|
|
Append
|
|
-> Seq Scan on i_row
|
|
-> Seq Scan on ij_row_row
|
|
-> Seq Scan on ij_row_col
|
|
(4 rows)
|
|
|
|
SELECT * FROM i_row;
|
|
i
|
|
---------------------------------------------------------------------
|
|
100
|
|
300
|
|
400
|
|
(3 rows)
|
|
|
|
EXPLAIN (costs off) SELECT * FROM ONLY i_row;
|
|
QUERY PLAN
|
|
---------------------------------------------------------------------
|
|
Seq Scan on i_row
|
|
(1 row)
|
|
|
|
SELECT * FROM ONLY i_row;
|
|
i
|
|
---------------------------------------------------------------------
|
|
100
|
|
(1 row)
|
|
|
|
EXPLAIN (costs off) SELECT * FROM i_col;
|
|
QUERY PLAN
|
|
---------------------------------------------------------------------
|
|
Append
|
|
-> Seq Scan on i_col
|
|
-> Seq Scan on ij_col_row
|
|
-> Seq Scan on ij_col_col
|
|
(4 rows)
|
|
|
|
SELECT * FROM i_col;
|
|
i
|
|
---------------------------------------------------------------------
|
|
200
|
|
500
|
|
600
|
|
(3 rows)
|
|
|
|
EXPLAIN (costs off) SELECT * FROM ONLY i_col;
|
|
QUERY PLAN
|
|
---------------------------------------------------------------------
|
|
Seq Scan on i_col
|
|
(1 row)
|
|
|
|
SELECT * FROM ONLY i_col;
|
|
i
|
|
---------------------------------------------------------------------
|
|
200
|
|
(1 row)
|
|
|
|
EXPLAIN (costs off) SELECT * FROM ij_row_row;
|
|
QUERY PLAN
|
|
---------------------------------------------------------------------
|
|
Seq Scan on ij_row_row
|
|
(1 row)
|
|
|
|
SELECT * FROM ij_row_row;
|
|
i | j
|
|
---------------------------------------------------------------------
|
|
300 | 1000
|
|
(1 row)
|
|
|
|
EXPLAIN (costs off) SELECT * FROM ij_row_col;
|
|
QUERY PLAN
|
|
---------------------------------------------------------------------
|
|
Seq Scan on ij_row_col
|
|
(1 row)
|
|
|
|
SELECT * FROM ij_row_col;
|
|
i | j
|
|
---------------------------------------------------------------------
|
|
400 | 2000
|
|
(1 row)
|
|
|
|
EXPLAIN (costs off) SELECT * FROM ij_col_row;
|
|
QUERY PLAN
|
|
---------------------------------------------------------------------
|
|
Seq Scan on ij_col_row
|
|
(1 row)
|
|
|
|
SELECT * FROM ij_col_row;
|
|
i | j
|
|
---------------------------------------------------------------------
|
|
500 | 3000
|
|
(1 row)
|
|
|
|
EXPLAIN (costs off) SELECT * FROM ij_col_col;
|
|
QUERY PLAN
|
|
---------------------------------------------------------------------
|
|
Seq Scan on ij_col_col
|
|
(1 row)
|
|
|
|
SELECT * FROM ij_col_col;
|
|
i | j
|
|
---------------------------------------------------------------------
|
|
600 | 4000
|
|
(1 row)
|
|
|
|
SET columnar.enable_custom_scan TO DEFAULT;
|
|
DROP TABLE i_row CASCADE;
|
|
NOTICE: drop cascades to 2 other objects
|
|
DETAIL: drop cascades to table ij_row_row
|
|
drop cascades to table ij_row_col
|
|
DROP TABLE i_col CASCADE;
|
|
NOTICE: drop cascades to 2 other objects
|
|
DETAIL: drop cascades to table ij_col_row
|
|
drop cascades to table ij_col_col
|