mirror of
https://github.com/timescale/timescaledb.git
synced 2025-05-25 07:40:48 +08:00
This change adds equivalence class members for non segment by attributes of compressed tables. Before the change introduced by this PR, we added equivalence members to the compressed chunk only for segment by columns. If we have a join condition like: hyper.segment_col = A.col1 and hyper.compressed_attr = A.col2 The compressed rel had EM only for compressed_chunk.segment_col = A.col1 When a parameterized path is created for the compressed chunk, it has only 1 clause (corresponding to the segment by EM ) in its list of ppi_clauses. The other clause is missing since it did not have an EM. A parameterized path is expected to carry all the clauses that come from the outer_rel for the join (table A in this case).Since the ppi_clauses did not have all the clauses that come from table A, we ended up missing a join condition (for table A) when we had a parameterized index path for the compressed chunk. Fixes #2673
208 lines
5.4 KiB
SQL
208 lines
5.4 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.
|
|
|
|
SET work_mem TO '50MB';
|
|
|
|
---Lets test for index backward scans instead of seq scans ------------
|
|
-- for ordered append tests on compressed chunks we need a hypertable with time as compress_orderby column
|
|
-- should not have ordered DecompressChunk path because segmentby columns are not part of pathkeys
|
|
|
|
:PREFIX
|
|
SELECT *
|
|
FROM (
|
|
SELECT *
|
|
FROM metrics_ordered_idx
|
|
ORDER BY time DESC
|
|
LIMIT 10) AS q
|
|
ORDER BY 1,
|
|
2,
|
|
3,
|
|
4;
|
|
|
|
-- should have ordered DecompressChunk path because segmentby columns have equality constraints
|
|
:PREFIX
|
|
SELECT *
|
|
FROM (
|
|
SELECT *
|
|
FROM metrics_ordered_idx
|
|
WHERE device_id = 3
|
|
AND device_id_peer = 3
|
|
ORDER BY time DESC
|
|
LIMIT 10) AS q
|
|
ORDER BY 1,
|
|
2,
|
|
3,
|
|
4;
|
|
|
|
:PREFIX SELECT DISTINCT ON (d.device_id)
|
|
*
|
|
FROM metrics_ordered_idx d
|
|
INNER JOIN LATERAL (
|
|
SELECT *
|
|
FROM metrics_ordered_idx m
|
|
WHERE m.device_id = d.device_id
|
|
AND m.device_id_peer = 3
|
|
ORDER BY time DESC
|
|
LIMIT 1) m ON m.device_id_peer = d.device_id_peer
|
|
WHERE extract(minute FROM d.time) = 0;
|
|
|
|
:PREFIX
|
|
SELECT d.device_id,
|
|
m.time,
|
|
m.time
|
|
FROM metrics_ordered_idx d
|
|
INNER JOIN LATERAL (
|
|
SELECT *
|
|
FROM metrics_ordered_idx m
|
|
WHERE m.device_id = d.device_id
|
|
AND m.device_id_peer = 3
|
|
ORDER BY time DESC
|
|
LIMIT 1) m ON m.device_id_peer = d.device_id_peer
|
|
WHERE extract(minute FROM d.time) = 0;
|
|
|
|
--github issue 1558
|
|
SET enable_seqscan = FALSE;
|
|
|
|
SET enable_bitmapscan = FALSE;
|
|
|
|
SET max_parallel_workers_per_gather = 0;
|
|
|
|
SET enable_hashjoin = FALSE;
|
|
|
|
SET enable_mergejoin = FALSE;
|
|
|
|
:PREFIX
|
|
SELECT device_id,
|
|
count(*)
|
|
FROM (
|
|
SELECT *
|
|
FROM metrics_ordered_idx mt,
|
|
nodetime nd
|
|
WHERE mt.time > nd.start_time
|
|
AND mt.device_id = nd.node
|
|
AND mt.time < nd.stop_time) AS subq
|
|
GROUP BY device_id;
|
|
|
|
:PREFIX
|
|
SELECT nd.node,
|
|
mt.*
|
|
FROM metrics_ordered_idx mt,
|
|
nodetime nd
|
|
WHERE mt.time > nd.start_time
|
|
AND mt.device_id = nd.node
|
|
AND mt.time < nd.stop_time
|
|
ORDER BY time;
|
|
|
|
SET enable_seqscan = TRUE;
|
|
|
|
SET enable_bitmapscan = TRUE;
|
|
|
|
SET enable_seqscan = TRUE;
|
|
|
|
SET enable_bitmapscan = TRUE;
|
|
|
|
SET max_parallel_workers_per_gather = 0;
|
|
|
|
SET enable_mergejoin = TRUE;
|
|
|
|
SET enable_hashjoin = FALSE;
|
|
|
|
:PREFIX
|
|
SELECT nd.node,
|
|
mt.*
|
|
FROM metrics_ordered_idx mt,
|
|
nodetime nd
|
|
WHERE mt.time > nd.start_time
|
|
AND mt.device_id = nd.node
|
|
AND mt.time < nd.stop_time
|
|
ORDER BY time;
|
|
|
|
SET enable_mergejoin = FALSE;
|
|
|
|
SET enable_hashjoin = TRUE;
|
|
|
|
:PREFIX
|
|
SELECT nd.node,
|
|
mt.*
|
|
FROM metrics_ordered_idx mt,
|
|
nodetime nd
|
|
WHERE mt.time > nd.start_time
|
|
AND mt.device_id = nd.node
|
|
AND mt.time < nd.stop_time
|
|
ORDER BY time;
|
|
|
|
--enable all joins after the tests
|
|
SET enable_mergejoin = TRUE;
|
|
|
|
SET enable_hashjoin = TRUE;
|
|
|
|
--end github issue 1558
|
|
|
|
-- github issue 2673
|
|
-- nested loop join with parameterized path
|
|
-- join condition has a segment by column and another column.
|
|
SET enable_hashjoin = false;
|
|
SET enable_mergejoin=false;
|
|
SET enable_material = false;
|
|
SET enable_seqscan = false;
|
|
|
|
-- restrict so that we select only 1 chunk.
|
|
:PREFIX
|
|
WITH lookup as ( SELECT * from (values( 3, 5) , (3, 4) ) as lu( did, version) )
|
|
SELECT met.*, lookup.*
|
|
FROM metrics_ordered_idx met join lookup
|
|
ON met.device_id = lookup.did and met.v0 = lookup.version
|
|
WHERE met.time > '2000-01-19 19:00:00-05'
|
|
and met.time < '2000-01-20 20:00:00-05';
|
|
|
|
--add filter to segment by (device_id) and compressed attr column (v0)
|
|
:PREFIX
|
|
WITH lookup as ( SELECT * from (values( 3, 5) , (3, 4) ) as lu( did, version) )
|
|
SELECT met.*, lookup.*
|
|
FROM metrics_ordered_idx met join lookup
|
|
ON met.device_id = lookup.did and met.v0 = lookup.version
|
|
WHERE met.time > '2000-01-19 19:00:00-05'
|
|
and met.time < '2000-01-20 20:00:00-05'
|
|
and met.device_id = 3 and met.v0 = 5;
|
|
|
|
:PREFIX
|
|
WITH lookup as ( SELECT * from (values( 3, 5) , (3, 4) ) as lu( did, version) )
|
|
SELECT met.*, lookup.*
|
|
FROM metrics_ordered_idx met join lookup
|
|
ON met.device_id = lookup.did and met.v0 = lookup.version
|
|
WHERE met.time = '2000-01-19 19:00:00-05'
|
|
and met.device_id = 3
|
|
and met.device_id_peer = 3 and met.v0 = 5;
|
|
|
|
-- lateral subquery
|
|
:PREFIX
|
|
WITH f1 as ( SELECT * from (values( 7, 5, 4) , (4, 5, 5) ) as lu( device_id, device_id_peer, v0) )
|
|
SELECT * FROM metrics_ordered_idx met
|
|
JOIN LATERAL
|
|
( SELECT node, f1.* from nodetime , f1
|
|
WHERE node = f1.device_id) q
|
|
ON met.device_id = q.node and met.device_id_peer = q.device_id_peer
|
|
and met.v0 = q.v0 and met.v0 > 2 and time = '2018-01-19 20:00:00-05';
|
|
|
|
-- filter on compressed attr (v0) with seqscan enabled and indexscan
|
|
-- disabled. filters on compressed attr should be above the seq scan.
|
|
SET enable_seqscan = true;
|
|
SET enable_indexscan = false;
|
|
:PREFIX
|
|
WITH lookup as ( SELECT * from (values( 3, 5) , (3, 4) ) as lu( did, version) )
|
|
SELECT met.*, lookup.*
|
|
FROM metrics_ordered_idx met join lookup
|
|
ON met.device_id = lookup.did and met.v0 = lookup.version
|
|
and met.device_id = 3
|
|
WHERE met.time > '2000-01-19 19:00:00-05'
|
|
and met.time < '2000-01-20 20:00:00-05'
|
|
and met.device_id = 3
|
|
and met.device_id_peer = 3 and met.v0 = 5;
|
|
|
|
RESET enable_hashjoin ;
|
|
RESET enable_mergejoin;
|
|
RESET enable_material ;
|
|
RESET enable_indexscan ;
|
|
--end github issue 2673
|