我的表包含10亿条记录。它也按月份划分。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秒内随附。
这是join的本质,通常被称为耗时操作。
首先,我建议使用in
而不是join
。当然,它们有不同的含义,但在某些情况下,从技术上讲,它们可以互换使用。看看这个问题。
其次,根据关系代数,每当您使用join时,mytable表的每一行都与第二个表中的每一行都组合在一起,DBMS需要制作一个巨大的临时表,并最终删除不合适的行。毫无疑问,所有的步骤和结果都需要很长时间。在使用联接操作之前,最好先筛选表(例如基于mytable的日期(并使其变小,然后使用联接操作。