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

在分析工作中,SELECT count(DISTINCT user_id) 看似简单,却会直接导致 Postgres 放弃并行查询。哪怕你有再多 CPU 核心,只要出现 DISTINCT,整个语句就会退化为单核串行执行,甚至引发磁盘临时文件溢出。这是因为 Postgres 的并行聚合机制无法合并不同工作线程的“去重”结果。文章通过实际测试对比,展示了如何通过将 DISTINCT 改写为 GROUP BY 子查询来恢复并行能力,使查询速度提升 3.4 倍。对于处理大规模数据表的开发者来说,理解这一机制差异至关重要。
一个关键词 DISTINCT 就会关闭整个语句的并行查询,表越大,代价越高。
- muth02446
如果你对 'DISTINCT' 的近似结果满意,Flajolet 和 Martin 提出了一种迷人的概率算法:
https://en.wikipedia.org/wiki/Flajolet%E2%80%93Martin_algori...
该算法仅需 10 行代码,且无需排序。
其改进版本包括 LogLog 和 HyperLogLog。
- natmaka
同理可证:https://www.snowflake.com/en/blog/engineering/postgres-count...
- thecaio
即便这篇文章并非完全由 AI 生成的垃圾内容,也很难让人有动力去认真研读。