在时间刻度数据库中,在查询压缩块时,不会使用逐段索引.如何确保在查询时使用索引



下面是我的表模式:-

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');

图像1

但从图1中可以看出,在解释中,机器代码上没有使用索引扫描

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

图像2从图2中可以看出,形成了压缩_超表_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中的这个答案建议将TEXT用于按列分段。在您的案例中,您使用类型VARYING,这引入了对强制转换的需求。由于在列上使用了强制转换,因此不能使用索引。

最新更新