嗨,我有一个表,定义如下(实际上它有很多分区表)
CREATE TABLE sensor_values
(
ts TIMESTAMPTZ(35, 6) NOT NULL,
value FLOAT8(17, 17) DEFAULT 'NaN' :: REAL NOT NULL,
sensor_id INT4(10) NOT NULL,
status TRIDIUM_STATUS(max) DEFAULT 'unknown' NOT NULL,
original_value FLOAT8(17, 17)
);
CREATE UNIQUE INDEX sensor_values_sensor_id_timestamp_index
ON sensor_values (sensor_id, ts);
CREATE INDEX sensor_values_sensor_id_timestamp_value_index
ON sensor_values (sensor_id, ts, value);我试图获得按sensor_id和day分组的最后几天值。
SELECT sensor_id, ts::date, MIN(ts), MAX(ts), MIN(value), MAX(value) FROM sensor_values
WHERE ts >= '2021-03-22 00:00:00+00:00' GROUP BY 1, 2;是可以接受的。我希望更好。我猜当天我应该有一个部分指数来加快速度。解释分析显示在
https://explain.depesz.com/s/jYsM
如果我添加了一个子查询来让一天开始,那么选择时间就更糟糕了
SELECT sensor_id, ts::date, MIN(ts), MAX(ts), MIN(value), MAX(value) FROM sensor_values
WHERE ts >= (SELECT MAX(day) + INTERVAL '1 days' FROM sensor_values_days_private LIMIT 1) GROUP BY 1, 2;https://explain.depesz.com/s/1o4I
我是否可以让postgres理解子查询返回一个不变的常量并使其在第一个查询的时间上相等?
我是否正确地认为我需要一个日期时间列的部分索引?
谢谢
发布于 2021-03-23 12:09:00
CREATE UNIQUE INDEX sensor_values_sensor_id_timestamp_index
ON sensor_values (sensor_id, ts);
CREATE INDEX sensor_values_sensor_id_timestamp_value_index
ON sensor_values (sensor_id, ts, value);你可以做的是:
CREATE UNIQUE INDEX sensor_values_sensor_id_timestamp_index
ON sensor_values (sensor_id, ts) INCLUDE (value);这将创建唯一的约束索引,并将“值”存储在其中,因为我假设您希望将其用作覆盖索引。删除第二个索引,现在已经没用了。您可以使用回收的磁盘空间在(ts)上创建索引,这将有助于查询最后一天的记录。
我是否正确地认为我需要一个日期时间列的部分索引?
不能使用"current day“这样的where子句创建带有变量的部分索引。
但是您只能在最后一个分区上创建它。
https://dba.stackexchange.com/questions/287470
复制相似问题