它总是在Postgresql中的列上使用seq scan,这会导致性能问题

它总是在Postgresql中的列上使用seq scan,这会导致性能问题,sql,postgresql,performance,Sql,Postgresql,Performance,我们使用postgresql并有一个表,如table1。表中共有500k数据,400k状态为“A”。我们有一个SQL来过滤数据,并且有一个基于状态的条件。SQL执行时间约为1分钟。因为筛选“A”的状态条件使用seq scan需要很多时间,如果删除此条件,sql可以在几秒钟内完成。我还尝试了“从表1中选择*,其中state='A'”。它还使用了seq扫描,速度非常慢。对于其他状态,它使用索引扫描,速度非常快 我读过一篇文章说,如果数据超过表的10%,它将直接使用seq扫描。因此,我想询问这种情况下

我们使用postgresql并有一个表,如table1。表中共有500k数据,400k状态为“A”。我们有一个SQL来过滤数据,并且有一个基于状态的条件。SQL执行时间约为1分钟。因为筛选“A”的状态条件使用seq scan需要很多时间,如果删除此条件,sql可以在几秒钟内完成。我还尝试了“从表1中选择*,其中state='A'”。它还使用了seq扫描,速度非常慢。对于其他状态,它使用索引扫描,速度非常快


我读过一篇文章说,如果数据超过表的10%,它将直接使用seq扫描。因此,我想询问这种情况下如何优化SQL以使其快速执行。

如果一个表的500000行中有400000行具有
状态='a'
,使用索引扫描将比顺序扫描更昂贵。在这种情况下,读取索引是不必要的额外工作,因为您实际上必须读取整个表

这是正常的,这样的查询需要更长的时间,因为它有更多的工作要做。如果花费的时间过长,则问题可能是您的客户端在消化许多结果行时遇到问题(请尝试使用
EXPLAIN(ANALYZE)
查看服务器上的执行时间)


使这种查询更快的唯一方法是获得更快的存储或将整个表加载到RAM中,例如使用
pg_prewarm
扩展名。

“我们有一个SQL来过滤数据”如何过滤?当您说SQL语句在几秒钟内完成时,我认为您没有考虑将整个数据拉至客户所需的时间。坦率地说,你为什么要查询这么多的数据呢。解释你的用例。在过滤和未过滤中,都需要完全读取整个数据。整个SQL就像从表1中选择*,其中状态在(C,D)或(状态在(a,B)和duedate