我有一个包含“ 133,072,194”记录的表,我正在尝试执行
SELECT COUNT(test)
FROM mytable
WHERE test = false
但执行时间:128320.712 ms
我已经在测试列上建立了索引。您能否让我知道,我可以优化或更改什么,所以查询变得更快了?
因此,我的其他选择查询也无法正常工作。
答案 0 :(得分:1)
如果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(*)
的速度的更多注意事项,请参见my blog post。