一个 DISTINCT 让 Postgres 并行失效
The DISTINCT in Your COUNT

在分析工作中,SELECT count(DISTINCT user_id) 看似简单,却会直接导致 Postgres 放弃并行查询。哪怕你有再多 CPU 核心,只要出现 DISTINCT,整个语句就会退化为单核串行执行,甚至引发磁盘临时文件溢出。这是因为 Postgres 的并行聚合机制无法合并不同工作线程的“去重”结果。文章通过实际测试对比,展示了如何通过将 DISTINCT 改写为 GROUP BY 子查询来恢复并行能力,使查询速度提升 3.4 倍。对于处理大规模数据表的开发者来说,理解这一机制差异至关重要。
一个关键词 DISTINCT 就会关闭整个语句的并行查询,表越大,代价越高。