PostgreSQL高低基数索引的查询性能差异及选择咨询
低基数与高基数索引的性能差异疑问
我有一个业务场景:目标表可通过不同基数的列过滤获取所需数据集,且所有过滤场景均已创建索引。现在疑惑使用不同基数的列作为过滤条件是否存在显著性能差异,具体细节如下:
表结构与数据规模
涉及三张表:
account (id, ...):约1000条账户数据product(account_id, id, ...):约10000条产品数据,关联到对应账户sales(account_id, product_id, ...):约1亿条销售记录,关联账户和产品
查询需求与可选写法
需要查询两个账户的销售数据,查询包含大量业务逻辑,其中需创建一个基于sales表、按product_id分组的CTE。存在两种等价的JOIN方式(最终获取的销售数据一致,因为账户的销售数据等于其下所有产品的销售数据):
基础CTE定义
WITH fancy_accounts_select AS ( SELECT id AS account_id, ... ), product_with_all_the_stuff AS ( SELECT id AS product_id, ... )
写法一:通过低基数列关联(使用sales.account_id索引)
grouped_sales AS ( SELECT s.product_id, other_metrics FROM sales s JOIN fancy_accounts_select a ON a.account_id = s.account_id GROUP BY s.product_id )
写法二:通过高基数列关联(使用sales.product_id索引)
grouped_sales AS ( SELECT s.product_id, other_metrics FROM sales s JOIN product_with_all_the_stuff p ON p.product_id = s.product_id GROUP BY s.product_id )
测试结果与疑问
测试发现写法一最低执行时间为0.5s,写法二约2s。原以为PostgreSQL 15性能优异,两者执行时间会相近,但实际差异明显。使用EXPLAIN ANALYZE结果不稳定,且在PostgreSQL文档中未找到过多关于基数与索引性能的内容,想明确两个问题:
- 是否需要在意相对高低基数的索引列用于过滤的性能差异?
- 这里有没有遗漏的关键点导致两者性能差距如此之大?
内容的提问来源于stack exchange,提问作者Ilia
相关产品推荐
相关产品推荐

