基于基数的 Postgres 索引方法

Postgres Index Approach Base on Cardinality

GCP postgres 12.8


Table A (21 Million + rows)
Join with Table B (3 Million + rows)
On A.col_x=B.Col_x
Where B.Col_y=123;

A.Col_x 和 B.Col_x 都已编入索引(但在 table 中 Col_x 的相同值的数千行不是唯一的)和连接性能很好 'Index Scan'.

过滤器 'B.Col_y=123'(目前尚未编入索引)导致 'parallel Seq Scan'。我想在 B.Col_y 上创建索引。 B.Col_y 值在 table B 中是唯一的。

专家请考虑列 B.Col_x(每个值千个)和 B.Col_y(唯一)的基数,并告诉我哪个新索引在我的情况下表现最好。

  1. B.Col_y
  2. 上的独立索引
  3. 双列索引 (B.Col_y,B.Col_x)
  4. 双列索引 (B.Col_x,B.Col_y)
  5. B.Col_x 的容器索引包含(Col_y)
  6. 任何其他选项

此外希望了解多列索引如何在 Postures 中工作以提高性能,它与 Oracle 和 SQL Server 有何不同。如何从左到右放置低和高基数列等等。

愿望

根据您的描述,理想的访问路径是嵌套循环连接,B 作为外部 table。

因此您应该在 B(Col_y) 上创建一个索引。连同现有的索引 om A(Col_x),应该可以解决问题。