说,我有一个表my_table
,其中包含字段kind:string
以及此字段的索引。
我注意到Postgres为查询构建了两个不同的查询计划:
SELECT * FROM my_table
WHERE kind = 'kind1' OR kind IS NULL;
和
SELECT * FROM my_table
WHERE kind = 'kind1';
第一个不使用索引,而第二个不使用索引。为什么呢?
我知道有很多条件可以使用或不使用索引,我已经阅读了很多关于查询计划的内容,但这种情况对我来说仍然不清楚。
答案 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可能会选择在每个子查询上使用索引,如果它们适合于数据。