2016-04-14 25 views
1

說,我有一個表my_table,其中的字段爲kind:string,並且在此字段上有一個索引。在Postgres中使用OR條件時,跳過查詢計劃中的索引

我注意到的Postgres建立了查詢兩個不同的查詢計劃:

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

SELECT * FROM my_table 
WHERE kind = 'kind1'; 

而第二個做第一個不使用索引。爲什麼?

我知道有很多條件可能會使用索引或不使用索引,而且我已閱讀了很多關於查詢計劃的內容,但這種情況仍然不清楚。

+3

實際上'kind IN('kind1',NULL)'等於'kind ='kind1''。 – Abelisto

+0

@Abelisto,愚蠢的問題,編輯它 –

回答

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的可能選擇,在每個子查詢中使用索引,如果它們適合的數據。

+0

不能重寫這樣的查詢,它只是一個巨大的一部分 –