timescaledb/tsl/test/sql/debug_notice.sql
Nikhil Sontakke 2a2b394172 Avoid distributed chunks scan plans
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
2022-01-18 14:05:52 +05:30

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;