在Postgres中使用OR条件时,将跳过查询计划中的索引

时间:2016-04-14 09:51:59

标签: sql postgresql indexing conditional-statements

说,我有一个表my_table,其中包含字段kind:string以及此字段的索引。

我注意到Postgres为查询构建了两个不同的查询计划:

SELECT * FROM my_table
WHERE kind = 'kind1' OR kind IS NULL;

SELECT * FROM my_table
WHERE kind = 'kind1';

第一个不使用索引,而第二个不使用索引。为什么呢?

我知道有很多条件可以使用或不使用索引,我已经阅读了很多关于查询计划的内容,但这种情况对我来说仍然不清楚。

1 个答案:

答案 0 :(得分:1)

Abelisto解释说,查询的两个版本不一样。 SQL引擎(通常)在使用OR的索引方面做得很差。可能有这么多NULL个值,Postgres在与NULL进行比较时根本不认为索引是有用的。这取决于数据。

您可以尝试将查询重写为:

SELECT *
FROM my_table
WHERE kind = 'type1'
UNION ALL
SELECT *
FROM my_table
WHERE kind IS NULL;

Postgres可能会选择在每个子查询上使用索引,如果它们适合于数据。