mirror of
https://github.com/timescale/timescaledb.git
synced 2025-05-18 03:23:37 +08:00
The number of loops per subplan is not stable in the parallel aggregation leading to that test sometimes failing. This patch changes this query to run EXPLAIN without ANALYZE.
78 lines
2.7 KiB
MySQL
78 lines
2.7 KiB
MySQL
-- This file and its contents are licensed under the Apache License 2.0.
|
|
-- Please see the included NOTICE for copyright information and
|
|
-- LICENSE-APACHE for a copy of the license.
|
|
|
|
--parallel queries require big-ish tables so collect them all here
|
|
--so that we need to generate queries only once.
|
|
|
|
-- look at postgres version to decide whether we run with analyze or without
|
|
SELECT
|
|
CASE WHEN current_setting('server_version_num')::int >= 100000
|
|
THEN 'EXPLAIN (analyze, costs off, timing off, summary off)'
|
|
ELSE 'EXPLAIN (costs off)'
|
|
END AS "PREFIX"
|
|
\gset
|
|
|
|
CREATE TABLE test (i int, j double precision, ts timestamp);
|
|
SELECT create_hypertable('test','i',chunk_time_interval:=500000);
|
|
--has to be big enough to force at least 2 workers below.
|
|
INSERT INTO test SELECT x, x+0.1, _timescaledb_internal.to_timestamp(x*1000) FROM generate_series(0,1000000-1) AS x;
|
|
|
|
ANALYZE test;
|
|
|
|
SET work_mem TO '50MB';
|
|
SET force_parallel_mode = 'on';
|
|
SET max_parallel_workers_per_gather = 4;
|
|
|
|
EXPLAIN (costs off) SELECT first(i, j) FROM "test";
|
|
SELECT first(i, j) FROM "test";
|
|
|
|
EXPLAIN (costs off) SELECT last(i, j) FROM "test";
|
|
SELECT last(i, j) FROM "test";
|
|
|
|
-- we dont run this with analyze because the sort memory usage is not stable
|
|
EXPLAIN (costs off) SELECT time_bucket('1 second', ts) sec, last(i, j)
|
|
FROM "test"
|
|
GROUP BY sec
|
|
ORDER BY sec
|
|
LIMIT 5;
|
|
|
|
SELECT time_bucket('1 second', ts) sec, last(i, j)
|
|
FROM "test"
|
|
GROUP BY sec
|
|
ORDER BY sec
|
|
LIMIT 5;
|
|
|
|
--test variants of histogram
|
|
EXPLAIN (costs off) SELECT histogram(i, 1, 1000000, 2) FROM "test";
|
|
SELECT histogram(i, 1, 1000000, 2) FROM "test";
|
|
|
|
EXPLAIN (costs off) SELECT histogram(i, 1,1000001,10) FROM "test";
|
|
SELECT histogram(i, 1, 1000001, 10) FROM "test";
|
|
|
|
EXPLAIN (costs off) SELECT histogram(i, 0,100000,5) FROM "test";
|
|
SELECT histogram(i, 0, 100000, 5) FROM "test";
|
|
|
|
EXPLAIN (costs off) SELECT histogram(i, 10,100000,5) FROM "test";
|
|
SELECT histogram(i, 10, 100000, 5) FROM "test";
|
|
|
|
-- test constraint aware append
|
|
:PREFIX SELECT i FROM "test" WHERE length(version()) > 0;
|
|
|
|
-- test constraint aware append with parallel aggregation
|
|
SET max_parallel_workers_per_gather = 1;
|
|
EXPLAIN (costs off) SELECT count(*) FROM "test" WHERE length(version()) > 0;
|
|
SELECT count(*) FROM "test" WHERE length(version()) > 0;
|
|
SET max_parallel_workers_per_gather = 4;
|
|
|
|
-- now() is not marked parallel safe in PostgreSQL < 12 so using now()
|
|
-- in a query will prevent parallelism but CURRENT_TIMESTAMP and
|
|
-- transaction_timestamp() are marked parallel safe
|
|
:PREFIX SELECT i FROM "test" WHERE ts < CURRENT_TIMESTAMP;
|
|
|
|
:PREFIX SELECT i FROM "test" WHERE ts < transaction_timestamp();
|
|
|
|
-- this won't be parallel query because now() is parallel restricted in PG < 12
|
|
:PREFIX SELECT i FROM "test" WHERE ts < now();
|
|
|