在postgresql中,Select查询变得非常慢

在postgresql中,Select查询变得非常慢,postgresql,Postgresql,我有一个表,其中包含133072194条记录,我正在尝试执行 SELECT COUNT(test) FROM mytable WHERE test = false 但它需要执行时间:128320.712毫秒 我已经在测试列上建立了索引。请让我知道,我可以优化或更改什么,以便我的查询更快 正因为如此,我的另一个select查询也无法工作。如果有许多行的测试为FALSE,那么您将无法比顺序扫描更快地获得准确的结果,而顺序扫描对于大型表来说速度较慢 如果只有几行满足条件,则应创建部分索引: CR

我有一个表,其中包含133072194条记录,我正在尝试执行

SELECT COUNT(test) 
FROM mytable 
WHERE test = false
但它需要执行时间:128320.712毫秒

我已经在测试列上建立了索引。请让我知道,我可以优化或更改什么,以便我的查询更快


正因为如此,我的另一个select查询也无法工作。

如果有许多行的测试为FALSE,那么您将无法比顺序扫描更快地获得准确的结果,而顺序扫描对于大型表来说速度较慢

如果只有几行满足条件,则应创建部分索引:

CREATE INDEX mytable_notest_ind ON mytable(id) WHERE NOT test;
假设id是主键,并经常保持mytable自动清空,以便只扫描索引

但是,对于这样的查询,通常不需要精确的结果

您可以使用如下查询从表统计信息计算估计计数:

SELECT t.reltuples
       * (1 - t.nullfrac)
       * mcv.freq AS count_false
FROM pg_stats AS s
   CROSS JOIN LATERAL unnest(s.most_common_vals::text::boolean[],
                             s.most_common_freqs) AS mcv(val, freq)
   JOIN pg_class AS t
      ON s.tablename = t.relname
         AND s.schemaname = t.relnamespace::regnamespace::text
WHERE s.tablename = 'mytable'
  AND s.attname = 'test'
  AND mcv.val = FALSE;
那会很快


有关选择计数速度的更多注意事项,请参见*

解释分析说明了什么?测试的列类型是什么?请回答您的问题并添加使用explain Analysis、buffers、format text生成的完整执行计划。PostgreSQL是否应该对此类查询执行仅索引扫描?理论上,它应该和面向列的dbms一样快。PS:啊,是的,我读了你提到的文章中的“仅使用索引扫描”部分,非常感谢。顺便说一句,版本控制不仅对表数据有效,而且对索引也有效,这将很有趣。希望能读到你的下一篇文章。再次感谢。@Abelisto版本控制是个问题:索引项没有版本控制,因此只有当可见性映射知道表块中的所有元组对每个人都可见时,才可以进行仅索引扫描。这样就不必检查堆了。正如我所写的,这要求表最近已被清空。@laurenz Albe,我将检查count查询。但是,如果我需要从该表中获取数据呢?我如何优化它并使其更快?我需要使用limit获取100000条记录。@LaurenzAlbe,是的。我这样问是因为,我需要检查计数,如果计数超过100000,那么我需要获取循环中的100000条记录,并将其发送到API post请求。