mirror of
https://github.com/timescale/timescaledb.git
synced 2025-05-17 02:53:51 +08:00
This patch adds support for partial aggregations at the chunk level. The aggregation is replanned in the create_upper_paths_hook of PostgreSQL. The AggPath is split up into multiple AGGSPLIT_INITIAL_SERIAL operations (one on top of each chunk), which create partials, and one AGGSPLIT_FINAL_DESERIAL operation, which finalizes the aggregation.
83 lines
2.8 KiB
MySQL
83 lines
2.8 KiB
MySQL
-- This file and its contents are licensed under the Timescale License.
|
|
-- Please see the included NOTICE for copyright information and
|
|
-- LICENSE-TIMESCALE for a copy of the license.
|
|
|
|
SET timescaledb.enable_now_constify TO FALSE;
|
|
|
|
SELECT
|
|
format('include/%s.sql', :'TEST_BASE_NAME') as "TEST_QUERY_NAME",
|
|
format('%s/shared/results/%s_results_uncompressed.out', :'TEST_OUTPUT_DIR', :'TEST_BASE_NAME') as "TEST_RESULTS_UNCOMPRESSED",
|
|
format('%s/shared/results/%s_results_compressed.out', :'TEST_OUTPUT_DIR', :'TEST_BASE_NAME') as "TEST_RESULTS_COMPRESSED"
|
|
\gset
|
|
SELECT format('\! diff -u --label "Uncompressed results" --label "Compressed results" %s %s', :'TEST_RESULTS_UNCOMPRESSED', :'TEST_RESULTS_COMPRESSED') as "DIFF_CMD"
|
|
\gset
|
|
|
|
-- get EXPLAIN output for all variations
|
|
\set PREFIX 'EXPLAIN (analyze, costs off, timing off, summary off)'
|
|
\set PREFIX_VERBOSE 'EXPLAIN (analyze, costs off, timing off, summary off, verbose)'
|
|
|
|
set work_mem to '64MB';
|
|
|
|
set max_parallel_workers_per_gather to 0;
|
|
\set TEST_TABLE 'metrics'
|
|
\ir :TEST_QUERY_NAME
|
|
\set TEST_TABLE 'metrics_space'
|
|
\ir :TEST_QUERY_NAME
|
|
\set TEST_TABLE 'metrics_compressed'
|
|
\ir :TEST_QUERY_NAME
|
|
\set TEST_TABLE 'metrics_space_compressed'
|
|
\ir :TEST_QUERY_NAME
|
|
|
|
-- Disable plain/sorted aggregation to get a deterministic test output
|
|
SET timescaledb.enable_chunkwise_aggregation = OFF;
|
|
|
|
-- get results for all the queries
|
|
-- run queries on uncompressed hypertable and store result
|
|
\set PREFIX ''
|
|
\set PREFIX_VERBOSE ''
|
|
\set ECHO none
|
|
SET client_min_messages TO error;
|
|
|
|
-- run queries on compressed hypertable and store result
|
|
\set TEST_TABLE 'metrics'
|
|
\o :TEST_RESULTS_UNCOMPRESSED
|
|
\ir :TEST_QUERY_NAME
|
|
\set TEST_TABLE 'metrics_compressed'
|
|
\o :TEST_RESULTS_COMPRESSED
|
|
\ir :TEST_QUERY_NAME
|
|
\o
|
|
|
|
-- diff compressed and uncompressed results
|
|
:DIFF_CMD
|
|
|
|
-- do the same for space partitioned hypertable
|
|
\set TEST_TABLE 'metrics_space'
|
|
\o :TEST_RESULTS_UNCOMPRESSED
|
|
\ir :TEST_QUERY_NAME
|
|
\set TEST_TABLE 'metrics_space_compressed'
|
|
\o :TEST_RESULTS_COMPRESSED
|
|
\ir :TEST_QUERY_NAME
|
|
\o
|
|
|
|
-- diff compressed and uncompressed results
|
|
:DIFF_CMD
|
|
|
|
-- #4418
|
|
-- test ordered append planning when inner join 2 hypertables on time column
|
|
CREATE table i4418_1(time timestamptz, device text);
|
|
CREATE table i4418_2(time timestamptz, device text);
|
|
SELECT table_name FROM create_hypertable('i4418_1','time');
|
|
SELECT table_name FROM create_hypertable('i4418_2','time');
|
|
INSERT INTO i4418_1 SELECT time, 'device 1' FROM generate_series('2022-08-01'::timestamptz, '2022-08-20'::timestamptz,'3min'::interval) g(time);
|
|
INSERT INTO i4418_2 SELECT * FROM i4418_1;
|
|
|
|
EXPLAIN (analyze,costs off,timing off,summary off) SELECT time_bucket('1d', tbl1.time), count(*)
|
|
FROM i4418_1 tbl1
|
|
INNER JOIN i4418_2 tbl2
|
|
ON tbl1.device = tbl2.device AND tbl1.time = tbl2.time
|
|
GROUP BY 1 ORDER BY 1;
|
|
|
|
DROP TABLE i4418_1;
|
|
DROP TABLE i4418_2;
|
|
|