选择查询在PostgreSQL中变得非常非常非常慢

时间:2019-07-01 20:39:02

标签: postgresql

我有一个包含“ 133,072,194”记录的表,我正在尝试执行

SELECT COUNT(test) 
FROM mytable 
WHERE test = false

但执行时间:128320.712 ms

我已经在测试列上建立了索引。您能否让我知道,我可以优化或更改什么,所以查询变得更快了?

因此,我的其他选择查询也无法正常工作。

1 个答案:

答案 0 :(得分:1)

如果testFALSE的行很多,您将无法获得比顺序扫描更快的准确结果,而顺序扫描对于大表来说是很慢的。

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

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;

那会很快。

有关SELECT count(*)的速度的更多注意事项,请参见my blog post