You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 12:57:50