我有一个表,其中包含" 133,072,194"记录,我正在尝试执行
SELECT COUNT(test)
FROM mytable
WHERE test = false
,但要执行时间:128320.712 MS
我已经在测试列上有索引。您能让我知道,我可以优化或更改什么,所以我的查询变得更快?
因此,我的其他选择查询也不起作用。
如果test
是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;
那会很快。
有关SELECT count(*)
速度的更多注意事项。