PostgreSQL 9.4 Die Tabelle wird wie folgt erstellt:Warum kann Index Only Scan nicht für Indizes verwendet werden, die mit COALESCE erstellt wurden?
CREATE TABLE foo (
id integer,
date date,
value numeric(14,3)
);
ich eine Abfrage mit der ROW_NUMBER()
Fensterfunktion und COALESCE
zu optimieren. Für die effizienteste, neige ich Index Only Scan
in der folgenden Abfrage verwenden:
SELECT id, c_val
FROM (
SELECT id, COALESCE(value, 0) c_val, ROW_NUMBER() OVER(PARTITION BY id ORDER BY date DESC NULLS LAST) rn
FROM foo) sbt
WHERE sbt.rn = 1;
Also, wenn ich den Index zu erstellen, wie folgt:
CREATE INDEX ON foo (id, date DESC NULLS LAST, value);
die Planer wählen Index Only Scan
zu verwenden, aber wenn ich es tue es auf diese Weise:
CREATE INDEX ON foo (id, date DESC NULLS LAST, COALESCE(value, 0));
der Planer tut gerade Index Scan
.
Warum? Ich versuche, die Kosten der Auswertung der COALESCE
Funktion während der Ausführung der Abfrage zu vermeiden. Warum funktioniert es nicht mit Index Only Scan
?
Die "Kosten" von 'coalesce()' ist fast Null, mach dir keine Sorgen darüber. –