在 timescaledb 超表上也可以使用标准的 postgresql 方式吗?
CLUSTER [VERBOSE] tablename [ USING indexname ]
例子:
- 创建表和超类型
CREATE TABLE IF NOT EXISTS l1(
timestamp TIMESTAMP(6) NOT NULL,
data VARCHAR(8) NOT NULL,
SELECT create_hypertable('l1', 'timestamp', chunk_time_interval => interval '1 day');
- 生成这样的索引(可以使用此命令查看):
l1 | l1_timestamp_idx | CREATE INDEX l1_timestamp_idx ON public.l1 USING btree ("timestamp" DESC)
- 而不是
CLUSTER
这样的数据
CLUSTER l1 USING l1_timestamp_idx;
stdout: CLUSTER
看起来它有效..但是这是推荐的吗?是否可以颠倒CLUSTER
命令的顺序?意思是,首先用最低的时间戳对其进行排序。
我们建议改用 TimescaleDB 的 reorder_chunk 命令(或重新排序策略)。
CLUSTER 将对整个超表进行 ACCESS EXCLUSIVE 锁定,以防止在整个集群过程中发生任何操作(读取或写入)( https://www.postgresql.org/docs/current/sql-cluster.html)。
我们重新实现了类似的功能,
reorder_chunk
不再需要如此重的锁:它逐块操作,在重新排序/集群发生时,您仍然可以从表/块中读取。但要回答您的其他问题:
您可以按任一时间戳顺序订购。将要聚集/重新排序的索引定义为具有时间戳 DESC(降序)或 ASC(升序)顺序。
重新排序块对性能非常有用。如果要插入数据是松散的时间戳顺序,通常不需要时间戳。但是我们经常在复合中看到它们,所以如果你有一个设备和时间戳,你经常做这样的查询:
那么根据(device_id,timestamp)之类的复合索引重新排序非常有用。
https://docs.timescale.com/latest/api#reorder_chunk https://docs.timescale.com/latest/api#add_reorder_policy