基于基数的 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(唯一)的基数,并告诉我哪个新索引在我的情况下表现最好。
- B.Col_y
上的独立索引
- 双列索引 (B.Col_y,B.Col_x)
- 双列索引 (B.Col_x,B.Col_y)
- B.Col_x 的容器索引包含(Col_y)
- 任何其他选项
此外希望了解多列索引如何在 Postures 中工作以提高性能,它与 Oracle 和 SQL Server 有何不同。如何从左到右放置低和高基数列等等。
愿望
根据您的描述,理想的访问路径是嵌套循环连接,B
作为外部 table。
因此您应该在 B(Col_y)
上创建一个索引。连同现有的索引 om A(Col_x)
,应该可以解决问题。
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(唯一)的基数,并告诉我哪个新索引在我的情况下表现最好。
- B.Col_y 上的独立索引
- 双列索引 (B.Col_y,B.Col_x)
- 双列索引 (B.Col_x,B.Col_y)
- B.Col_x 的容器索引包含(Col_y)
- 任何其他选项
此外希望了解多列索引如何在 Postures 中工作以提高性能,它与 Oracle 和 SQL Server 有何不同。如何从左到右放置低和高基数列等等。
愿望
根据您的描述,理想的访问路径是嵌套循环连接,B
作为外部 table。
因此您应该在 B(Col_y)
上创建一个索引。连同现有的索引 om A(Col_x)
,应该可以解决问题。