首页 > 解决方案 > 在 PostgreSQL 中选择 10000 条记录需要很长时间

问题描述

我的表包含 10 亿条记录。它也按month.Id 分区,日期时间是表的主键。当我选择

select col1,col2,..col8
from mytable t 
inner join cte on t.Id=cte.id and dtime>'2020-01-01' and dtime<'2020-10-01'

它使用索引扫描,但需要超过 5 分钟才能选择。请给我建议。注意:我已将 work_mem 设置为 1GB。cte 表结果在 3 秒内提供。

标签: postgresql

解决方案


嗯,这是加入的本质,它通常被称为耗时的操作。

首先,我建议使用in而不是join. 当然,它们有不同的含义,但在某些情况下,从技术上讲,您可以互换使用它们。检查这个问题

其次,根据关系代数,每当你使用join时,mytable表的每一行都与第二个表的每一行相结合,DBMS需要做一个巨大的临时表,最后排除不合适的行。毫无疑问,所有步骤和结果都需要很长时间。在使用 Join 操作之前,最好过滤您的表(例如基于mytable的日期)并使其更小,然后使用 join 操作。


推荐阅读