CREATE INDEX ... WITH (timescaledb.transaction_per_chunk, ...);

此选项扩展了 CREATE INDEX,使其能够为每个在其上创建索引的数据块使用单独的事务,而不是为整个超表使用单个事务。这允许在 CREATE INDEX 命令的大部分持续时间内并发执行 INSERT 和其他操作。当在单个数据块上创建索引时,它的功能就像在该数据块上调用了常规的 CREATE INDEX 一样,但是其他数据块完全不受阻塞。

注意

此版本的 CREATE INDEX 可以用作 CREATE INDEX CONCURRENTLY 的替代方案,后者目前在超表上不受支持。

警告

如果操作在进行到一半时失败,则可能不会在所有超表数据块上创建索引。如果发生这种情况,超表的根表上的索引将被标记为无效。您可以通过在超表上运行 \d+ 来检查这一点。该索引仍然有效,并且会在新数据块上创建,但是如果您想确保所有数据块都有索引副本,请删除并重新创建它。

您还可以使用以下查询来查找所有无效索引

SELECT * FROM pg_index i WHERE i.indisvalid IS FALSE;

创建匿名索引

CREATE INDEX ON conditions(time, device_id)
WITH (timescaledb.transaction_per_chunk);

或者

CREATE INDEX ON conditions USING brin(time, location)
WITH (timescaledb.transaction_per_chunk);

关键词

在此页面上发现问题?报告问题 或 在 GitHub 上编辑此页面