2016-04-14 5 views
1

Angenommen, ich habe eine Tabelle my_table mit Feld kind:string und einen Index für dieses Feld.Index im Abfrageplan wird übersprungen, wenn OR-Bedingung in Postgres

Ich habe bemerkt, dass Postgres zwei verschiedene Abfragepläne für die Abfragen erstellt:

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

und

SELECT * FROM my_table 
WHERE kind = 'kind1'; 

Die erste nicht-Index nicht verwendet, während der zweite Fall ist. Warum?

Ich weiß, dass es viele Bedingungen gibt, warum Indizes verwendet werden können oder nicht, und ich habe viel über Abfragepläne gelesen, aber dieser Fall ist mir immer noch nicht klar.

+3

Eigentlich ist 'art IN ('kind1', NULL)' gleich 'kind = 'kind1''. – Abelisto

+0

@Abelisto, dumme Frage, bearbeitet –

Antwort

1

Abelisto erklärt, dass die beiden Versionen der Abfrage nicht identisch sind. SQL-Engines können (im Allgemeinen) die Verwendung von Indizes für OR s schlecht machen. Es ist möglich, dass es so viele NULL Werte gibt, dass Postgres einfach nicht denkt, dass ein Index nützlich ist, wenn er mit NULL s verglichen wird. Das hängt von den Daten ab.

können Sie versuchen, die Abfrage als Umschreiben:

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

Postgres können wählen, verwenden, um Indizes auf jeder Unterabfrage, wenn sie für die Daten geeignet sind.

+0

Kann diese Abfrage nicht so umschreiben, es ist nur ein Teil von einem großen –

Verwandte Themen