mirror of
https://github.com/timescale/timescaledb.git
synced 2025-05-16 02:23:49 +08:00
The current approach to planning queries on distributed hypertables first plans a "naive" plan for scanning each remote chunk individually (the chunks are children of an append) and then that plan gets replaced by a datanode scan plan (each data node is a child in the Append). While we need to include each chunk in the planning for cost reasons (we need to know the stats for chunk rels) we need not actually create paths for scanning chunks. This unnecessary work is now avoided and we now plan datanode scans directly. Fixes #3685
94 lines
3.3 KiB
SQL
94 lines
3.3 KiB
SQL
-- 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.
|
|
|
|
-- This test suite is not intended to check the output of the queries
|
|
-- but rather make sure that they are generated when certain flags are
|
|
-- enabled or disabled.
|
|
--
|
|
-- The queries below are triggering a call to `tsl_set_rel_pathlist`
|
|
-- and `get_foreign_upper_paths` respectively, but if that changes,
|
|
-- they might need to be changed.
|
|
|
|
\c :TEST_DBNAME :ROLE_CLUSTER_SUPERUSER
|
|
\set DN_DBNAME_1 :TEST_DBNAME _1
|
|
\set DN_DBNAME_2 :TEST_DBNAME _2
|
|
\set DN_DBNAME_3 :TEST_DBNAME _3
|
|
|
|
-- Add data nodes using the TimescaleDB node management API
|
|
SELECT * FROM add_data_node('data_node_1', host => 'localhost', database => :'DN_DBNAME_1');
|
|
SELECT * FROM add_data_node('data_node_2', host => 'localhost', database => :'DN_DBNAME_2');
|
|
SELECT * FROM add_data_node('data_node_3', host => 'localhost', database => :'DN_DBNAME_3');
|
|
GRANT USAGE ON FOREIGN SERVER data_node_1, data_node_2, data_node_3 TO PUBLIC;
|
|
|
|
CREATE TABLE hyper (time timestamptz, device int, location int, temp float);
|
|
SELECT * FROM create_distributed_hypertable('hyper', 'time', 'device');
|
|
|
|
SET enable_partitionwise_aggregate = ON;
|
|
|
|
INSERT INTO hyper VALUES
|
|
('2018-01-19 13:01', 1, 2, 2.3),
|
|
('2018-01-20 15:05', 1, 3, 5.3),
|
|
('2018-02-21 13:01', 3, 4, 1.5),
|
|
('2018-02-28 15:05', 1, 1, 5.6),
|
|
('2018-02-19 13:02', 3, 5, 3.1),
|
|
('2018-02-19 13:02', 2, 3, 6.7),
|
|
('2018-03-08 11:05', 6, 2, 8.1),
|
|
('2018-03-08 11:05', 7, 4, 4.6),
|
|
('2018-03-10 17:02', 5, 5, 5.1),
|
|
('2018-03-10 17:02', 1, 6, 9.1),
|
|
('2018-03-17 12:02', 2, 2, 6.7),
|
|
('2018-04-19 13:01', 1, 2, 7.6),
|
|
('2018-04-20 15:08', 5, 5, 6.4),
|
|
('2018-05-19 13:01', 4, 4, 5.1),
|
|
('2018-05-20 15:08', 5, 1, 9.4),
|
|
('2018-05-30 13:02', 3, 2, 9.0);
|
|
|
|
-- Update table stats
|
|
ANALYZE hyper;
|
|
|
|
-- Optimizer debug messages shown at debug level 2
|
|
SET client_min_messages TO DEBUG2;
|
|
|
|
-- Turning on show_rel should show a message
|
|
-- But disable the code which avoids dist chunk planning
|
|
SET timescaledb.debug_allow_datanode_only_path = 'off';
|
|
SET timescaledb.debug_optimizer_flags = 'show_rel';
|
|
SHOW timescaledb.debug_optimizer_flags;
|
|
|
|
SELECT time, device, avg(temp) AS temp
|
|
FROM hyper
|
|
WHERE time BETWEEN '2018-04-19 00:01' AND '2018-06-01 00:00'
|
|
GROUP BY 1, 2
|
|
ORDER BY 1, 2;
|
|
|
|
-- Enable session level datanode only path parameter which doesn't
|
|
-- plan distributed chunk scans unnecessarily
|
|
SET timescaledb.debug_allow_datanode_only_path = 'on';
|
|
|
|
-- Turning off the show_rel (and turning on another flag) should not
|
|
-- show a notice on the relations, but show the upper paths.
|
|
SET timescaledb.debug_optimizer_flags = 'show_upper=*';
|
|
SHOW timescaledb.debug_optimizer_flags;
|
|
|
|
SELECT time, device, avg(temp) AS temp
|
|
FROM hyper
|
|
WHERE time BETWEEN '2018-04-19 00:01' AND '2018-06-01 00:00'
|
|
GROUP BY 1, 2
|
|
ORDER BY 1, 2;
|
|
|
|
-- Turning off both relations should not show anything.
|
|
RESET timescaledb.debug_optimizer_flags;
|
|
SHOW timescaledb.debug_optimizer_flags;
|
|
|
|
SELECT time, device, avg(temp) AS temp
|
|
FROM hyper
|
|
WHERE time BETWEEN '2018-04-19 00:01' AND '2018-06-01 00:00'
|
|
GROUP BY 1, 2
|
|
ORDER BY 1, 2;
|
|
|
|
SET client_min_messages TO ERROR;
|
|
DROP DATABASE :DN_DBNAME_1;
|
|
DROP DATABASE :DN_DBNAME_2;
|
|
DROP DATABASE :DN_DBNAME_3;
|