Postgresql 使用datetime查询防止大规模顺序扫描 如何按日期筛选查询以防止对大型数据库进行大规模顺序扫描?

Postgresql 使用datetime查询防止大规模顺序扫描 如何按日期筛选查询以防止对大型数据库进行大规模顺序扫描?,postgresql,indexing,database-optimization,Postgresql,Indexing,Database Optimization,我的调查应用程序收集responses,调查中每个问题的答案都存储在表response\u answer中 当我查询当月的所有答复时,我按日期过滤;然而,postgres正在对所有回答(以百万计)进行顺序扫描,而且速度很慢 查询: 解释分析 选择计数(*) 从回应到回答 r.id上的左连接响应r=response\u answer.response\u id 其中r.date_记录在“2019-08-01T00:00:00.000Z”和“2019-08-29T23:59:59.999Z”之间;

我的调查应用程序收集
response
s,调查中每个问题的答案都存储在表
response\u answer

当我查询当月的所有答复时,我按日期过滤;然而,postgres正在对所有回答(以百万计)进行顺序扫描,而且速度很慢

查询:

解释分析
选择计数(*)
从回应到回答
r.id上的左连接响应r=response\u answer.response\u id
其中r.date_记录在“2019-08-01T00:00:00.000Z”和“2019-08-29T23:59:59.999Z”之间;
查询计划
聚合(成本=517661.09..517661.10行=1宽度=8)(实际时间=139362.882..139362.899行=1循环=1)
->散列联接(成本=8063.39..517565.30行=38316宽度=0)(实际时间=126512.031..136806.093行=316558循环=1)
哈希条件:(response\u answer.response\u id=r.id)
->回答时的顺序扫描(成本=0.00..480365.73行=7667473宽度=4)(实际时间=1.443..70216.817行=7667473循环=1)
->散列(成本=8053.35..8053.35行=803宽度=4)(实际时间=173.467..173.476行=7010循环=1)
bucket:8192(最初1024)批处理:1(最初1)内存使用:311kB
->响应r上的顺序扫描(成本=0.00..8053.35行=803宽度=4)(实际时间=0.489..107.417行=7010循环=1)
过滤器:((记录日期>='2019-08-01'::日期)和(在处观察到)您需要索引

response (date_recorded, id)

VACUUM
仅用于索引扫描的表格


对于这样的查询,您不需要外部联接。PostgreSQL非常聪明,可以根据
response.id
不能为
NULL

这一事实推断出这一点。好的,我将尝试清空并添加缺少的索引。您的意思是只使用常规联接而不是外部联接吗?是的。如果
r.id=response\u-answer.response\u-id
是真的,
r.id
不能
NULL
。哇,就是这样。在我清空两个表并添加2列索引后,它将28秒的查询缩短为2.6秒的查询。谢谢Laurenz!
response (date_recorded, id)
response_answer (response_id)