mirror of
https://github.com/timescale/timescaledb.git
synced 2025-05-21 13:14:19 +08:00
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
152 lines
7.6 KiB
Plaintext
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
|