首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用子查询获取一个值时,性能非常差

使用子查询获取一个值时,性能非常差
EN

Database Administration用户
提问于 2021-03-22 11:07:05
回答 1查看 171关注 0票数 0

嗨,我有一个表,定义如下(实际上它有很多分区表)

代码语言:javascript
复制
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分组的最后几天值。

代码语言:javascript
复制
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

如果我添加了一个子查询来让一天开始,那么选择时间就更糟糕了

代码语言:javascript
复制
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理解子查询返回一个不变的常量并使其在第一个查询的时间上相等?

我是否正确地认为我需要一个日期时间列的部分索引?

谢谢

EN

回答 1

Database Administration用户

发布于 2021-03-23 12:09:00

代码语言:javascript
复制
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);

你可以做的是:

代码语言:javascript
复制
CREATE UNIQUE INDEX sensor_values_sensor_id_timestamp_index
  ON sensor_values (sensor_id, ts) INCLUDE (value);

这将创建唯一的约束索引,并将“值”存储在其中,因为我假设您希望将其用作覆盖索引。删除第二个索引,现在已经没用了。您可以使用回收的磁盘空间在(ts)上创建索引,这将有助于查询最后一天的记录。

我是否正确地认为我需要一个日期时间列的部分索引?

不能使用"current day“这样的where子句创建带有变量的部分索引。

但是您只能在最后一个分区上创建它。

票数 2
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/287470

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档