timescaledb/test/expected/cluster.out
Joshua Lockerman 7741722e93 Add session locks to CLUSTER
This prevents the cluster index from being deleted or altered while in
middle of the CLUSTER.

We grab locks and mark the main table as CLUSTERed before working
on the chunks in order to prevent deadlocks with concurrent DROPs
2019-02-06 10:03:27 -05:00

152 lines
7.6 KiB
Plaintext

-- 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.
CREATE TABLE cluster_test(time timestamptz, temp float, location int);
SELECT create_hypertable('cluster_test', 'time', chunk_time_interval => interval '1 day');
NOTICE: adding not-null constraint to column "time"
create_hypertable
---------------------------
(1,public,cluster_test,t)
(1 row)
-- Show default indexes
SELECT * FROM test.show_indexes('cluster_test');
Index | Columns | Expr | Unique | Primary | Exclusion | Tablespace
-----------------------+---------+------+--------+---------+-----------+------------
cluster_test_time_idx | {time} | | f | f | f |
(1 row)
-- Create two chunks
INSERT INTO cluster_test VALUES ('2017-01-20T09:00:01', 23.4, 1),
('2017-01-21T09:00:01', 21.3, 2);
-- Run cluster
CLUSTER VERBOSE cluster_test USING cluster_test_time_idx;
INFO: clustering "_timescaledb_internal._hyper_1_2_chunk" using index scan on "_hyper_1_2_chunk_cluster_test_time_idx"
INFO: "_hyper_1_2_chunk": found 0 removable, 1 nonremovable row versions in 1 pages
INFO: clustering "_timescaledb_internal._hyper_1_1_chunk" using index scan on "_hyper_1_1_chunk_cluster_test_time_idx"
INFO: "_hyper_1_1_chunk": found 0 removable, 1 nonremovable row versions in 1 pages
-- Create a third chunk
INSERT INTO cluster_test VALUES ('2017-01-22T09:00:01', 19.5, 3);
-- Show clustered indexes
SELECT indexrelid::regclass, indisclustered
FROM pg_index
WHERE indisclustered = true ORDER BY 1;
indexrelid | indisclustered
--------------------------------------------------------------+----------------
cluster_test_time_idx | t
_timescaledb_internal._hyper_1_1_chunk_cluster_test_time_idx | t
_timescaledb_internal._hyper_1_2_chunk_cluster_test_time_idx | t
(3 rows)
-- Reorder just our table
CLUSTER VERBOSE cluster_test;
INFO: clustering "_timescaledb_internal._hyper_1_3_chunk" using index scan on "_hyper_1_3_chunk_cluster_test_time_idx"
INFO: "_hyper_1_3_chunk": found 0 removable, 1 nonremovable row versions in 1 pages
INFO: clustering "_timescaledb_internal._hyper_1_2_chunk" using sequential scan and sort
INFO: "_hyper_1_2_chunk": found 0 removable, 1 nonremovable row versions in 1 pages
INFO: clustering "_timescaledb_internal._hyper_1_1_chunk" using sequential scan and sort
INFO: "_hyper_1_1_chunk": found 0 removable, 1 nonremovable row versions in 1 pages
-- Show clustered indexes, including new chunk
SELECT indexrelid::regclass, indisclustered
FROM pg_index
WHERE indisclustered = true ORDER BY 1;
indexrelid | indisclustered
--------------------------------------------------------------+----------------
cluster_test_time_idx | t
_timescaledb_internal._hyper_1_1_chunk_cluster_test_time_idx | t
_timescaledb_internal._hyper_1_2_chunk_cluster_test_time_idx | t
_timescaledb_internal._hyper_1_3_chunk_cluster_test_time_idx | t
(4 rows)
-- Reorder all tables (although will only be our test table)
CLUSTER VERBOSE;
INFO: clustering "_timescaledb_internal._hyper_1_3_chunk" using sequential scan and sort
INFO: "_hyper_1_3_chunk": found 0 removable, 1 nonremovable row versions in 1 pages
INFO: clustering "_timescaledb_internal._hyper_1_1_chunk" using sequential scan and sort
INFO: "_hyper_1_1_chunk": found 0 removable, 1 nonremovable row versions in 1 pages
INFO: clustering "_timescaledb_internal._hyper_1_2_chunk" using sequential scan and sort
INFO: "_hyper_1_2_chunk": found 0 removable, 1 nonremovable row versions in 1 pages
INFO: clustering "public.cluster_test" using sequential scan and sort
INFO: "cluster_test": found 0 removable, 0 nonremovable row versions in 0 pages
-- Change the clustered index
CREATE INDEX ON cluster_test (time, location);
CLUSTER VERBOSE cluster_test using cluster_test_time_location_idx;
INFO: clustering "_timescaledb_internal._hyper_1_3_chunk" using sequential scan and sort
INFO: "_hyper_1_3_chunk": found 0 removable, 1 nonremovable row versions in 1 pages
INFO: clustering "_timescaledb_internal._hyper_1_2_chunk" using sequential scan and sort
INFO: "_hyper_1_2_chunk": found 0 removable, 1 nonremovable row versions in 1 pages
INFO: clustering "_timescaledb_internal._hyper_1_1_chunk" using sequential scan and sort
INFO: "_hyper_1_1_chunk": found 0 removable, 1 nonremovable row versions in 1 pages
-- Show updated clustered indexes
SELECT indexrelid::regclass, indisclustered
FROM pg_index
WHERE indisclustered = true ORDER BY 1;
indexrelid | indisclustered
----------------------------------------------------------+----------------
cluster_test_time_location_idx | t
_timescaledb_internal._hyper_1_1_chunk_time_location_idx | t
_timescaledb_internal._hyper_1_2_chunk_time_location_idx | t
_timescaledb_internal._hyper_1_3_chunk_time_location_idx | t
(4 rows)
--check the setting of cluster indexes on hypertables and chunks
ALTER TABLE cluster_test CLUSTER ON cluster_test_time_idx;
SELECT indexrelid::regclass, indisclustered
FROM pg_index
WHERE indisclustered = true
ORDER BY 1,2;
indexrelid | indisclustered
--------------------------------------------------------------+----------------
cluster_test_time_idx | t
_timescaledb_internal._hyper_1_1_chunk_cluster_test_time_idx | t
_timescaledb_internal._hyper_1_2_chunk_cluster_test_time_idx | t
_timescaledb_internal._hyper_1_3_chunk_cluster_test_time_idx | t
(4 rows)
CLUSTER VERBOSE cluster_test;
INFO: clustering "_timescaledb_internal._hyper_1_3_chunk" using sequential scan and sort
INFO: "_hyper_1_3_chunk": found 0 removable, 1 nonremovable row versions in 1 pages
INFO: clustering "_timescaledb_internal._hyper_1_2_chunk" using sequential scan and sort
INFO: "_hyper_1_2_chunk": found 0 removable, 1 nonremovable row versions in 1 pages
INFO: clustering "_timescaledb_internal._hyper_1_1_chunk" using sequential scan and sort
INFO: "_hyper_1_1_chunk": found 0 removable, 1 nonremovable row versions in 1 pages
ALTER TABLE cluster_test SET WITHOUT CLUSTER;
SELECT indexrelid::regclass, indisclustered
FROM pg_index
WHERE indisclustered = true
ORDER BY 1,2;
indexrelid | indisclustered
------------+----------------
(0 rows)
\set ON_ERROR_STOP 0
CLUSTER VERBOSE cluster_test;
ERROR: there is no previously clustered index for table "cluster_test"
\set ON_ERROR_STOP 1
ALTER TABLE _timescaledb_internal._hyper_1_1_chunk CLUSTER ON _hyper_1_1_chunk_cluster_test_time_idx;
SELECT indexrelid::regclass, indisclustered
FROM pg_index
WHERE indisclustered = true
ORDER BY 1,2;
indexrelid | indisclustered
--------------------------------------------------------------+----------------
_timescaledb_internal._hyper_1_1_chunk_cluster_test_time_idx | t
(1 row)
CLUSTER VERBOSE _timescaledb_internal._hyper_1_1_chunk;
INFO: clustering "_timescaledb_internal._hyper_1_1_chunk" using sequential scan and sort
INFO: "_hyper_1_1_chunk": found 0 removable, 1 nonremovable row versions in 1 pages
ALTER TABLE _timescaledb_internal._hyper_1_1_chunk SET WITHOUT CLUSTER;
SELECT indexrelid::regclass, indisclustered
FROM pg_index
WHERE indisclustered = true
ORDER BY 1,2;
indexrelid | indisclustered
------------+----------------
(0 rows)
\set ON_ERROR_STOP 0
CLUSTER VERBOSE _timescaledb_internal._hyper_1_1_chunk;
ERROR: there is no previously clustered index for table "_hyper_1_1_chunk"
\set ON_ERROR_STOP 1