如果存在多个索引,Postgres如何选择要使用的索引?

问题描述

我是Postgres的新手,如果我定义了多个btree索引,Postgres如何决定使用哪个索引就有些困惑。

CREATE INDEX index_1 ON sample_table USING btree (col1,col2,COALESCE(col3,'col3'::text));

CREATE INDEX index_2 ON sample_table USING btree (col1,'col3'::text));

当我(从源表)写入sample_table时,我在联接条件中使用col1,col2,COALESCE(col3,'col3':: text),但是当我进行解释分析以获取查询计划时,有时会看到它使用index_2而不是index_1进行扫描,有时只进行顺序扫描。我想了解是什么让Postgres使用一个索引而不是另一个索引?

解决方法

我没有看到EXPLAIN (ANALYZE,BUFFERS)的输出,只能给出一个通用的答案。

PostgreSQL考虑所有可行的执行计划,并估计每个节点的行数和成本。然后,它以最低的成本估算来制定计划。

col2上的条件有时可能更具选择性,而有时却更少,例如,因为您有时将其与罕见值(有时与频繁值)进行比较。如果涉及col2的条件不是选择性的,则使用两个索引中的哪个索引不会造成太大影响。在那种情况下,PostgreSQL偏爱较小的两栏索引。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...