在时间刻度数据库中,在查询压缩块时,未使用按索引分段。如何确保在查询时使用了索引?

In timescale db, while querying compressed chunks, segment by indexes are not getting used. How to make sure that indexes are used while querying?

下面是我的 table 架构:-

CREATE TABLE public.table1
(
   machinecode character varying(100) COLLATE pg_catalog."default" NOT NULL,
   groupname character varying(50) COLLATE pg_catalog."default" NOT NULL,
   sensor character varying(100) COLLATE pg_catalog."default" NOT NULL,
   "time" timestamp without time zone NOT NULL,
   value1 integer,
   value2 real,   
   PRIMARY KEY (machinecode, groupname,sensor, "time")
)

CREATE INDEX ON table1 (machinecode,groupname,sensor, time DESC);

SELECT create_hypertable('table1', 'time');
SELECT set_chunk_time_interval('table1', INTERVAL '24 hours');

ALTER TABLE table1 SET (
  timescaledb.compress,
  timescaledb.compress_segmentby = 'machinecode,groupname,sensor'
);

SELECT add_compression_policy('table1', INTERVAL '7 days');

Image 1

但是从图1可以看出,在explain中没有对machinecode使用索引扫描

select * from _timescaledb_catalog.hypertable
where id =
(SELECT compressed_hypertable_id FROM _timescaledb_catalog.hypertable
 WHERE table_name='table1');

image 2 从图 2 中可以看出 compressed_hypertable_18 已形成,索引相同是

CREATE INDEX _compressed_hypertable_18_machinecode__ts_meta_sequence_num_idx ON _timescaledb_internal._compressed_hypertable_18 USING btree (machinecode, _ts_meta_sequence_num)
CREATE INDEX _compressed_hypertable_18_groupname__ts_meta_sequence_num_idx ON _timescaledb_internal._compressed_hypertable_18 USING btree (groupname, _ts_meta_sequence_num)
CREATE INDEX _compressed_hypertable_18_sensor__ts_meta_sequence_num_idx ON _timescaledb_internal._compressed_hypertable_18 USING btree (sensor, _ts_meta_sequence_num)

但还在解释中,查询没有使用索引。

如何确保在查询时使用了索引。

您的查询计划表明问题在于将列转换为 TEXT。 GH 中的 This answer 建议对 segmentby 列使用 TEXT。在您的情况下,您使用类型 VARYING,这引入了转换的需要。并且由于在列上使用了转换,因此无法使用索引。