Select Query在PostgreSQL中变得非常非常慢



我有一个表,其中包含" 133,072,194"记录,我正在尝试执行

SELECT COUNT(test) 
FROM mytable 
WHERE test = false

,但要执行时间:128320.712 MS

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

因此,我的其他选择查询也不起作用。

如果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(*)速度的更多注意事项。

最新更新