PostgreSQL: Erstellen Sie einen index, um schnell zu unterscheiden, NULL von nicht-NULL-Werte

Betrachten Sie eine SQL-Abfrage mit der folgenden WHERE Prädikat:

...
WHERE name IS NOT NULL
...

Wo name ist ein Text-Feld in der PostgreSQL.

Keine andere Abfrage überprüfen Sie jede Art von Text-Eigenschaft mit diesem Wert, nur ob es NULL oder nicht. Daher eine vollständige btree-index scheint wie ein overkill, auch wenn es unterstützt diese Unterscheidung:

Auch, eine IST NULL oder IST NICHT NULL-Bedingung, die auf einer index-Spalte kann verwendet werden, mit einer B-tree-index.

Was ist die richtige PostgreSQL-index schnell zu unterscheiden NULLs aus nicht-NULLs?

  • Sie können fügen Sie Prädikat der create index zumindest Minimierung Ihrer Größe.
  • Wie Sie haben keine andere Wahl, als btree, gist, gin und hash, die entmutigt, ich sehe nicht ein anderer Weg möglich.
  • Sie können create index i on t (coalesce('NULL',col)); tatsächlich index NULL und Trennung einer null-Werte aus anderen Nullen
  • o_O? NULL indiziert ist. Wo kommst du auf die Idee, dass es gar nicht?
  • ja es ist indiziert, aber alle null-Werte Verschieden sind, und ich glaube, Adam will, um zu sehen, null-Werte als gleich. Adam?..
  • Der b-Baum für NULL enthält eine Zeile Zeiger auf jede Zeile mit NULL in diesem Bereich. Während Sie ungleich, Sie alle entsprechen, das Prädikat IS NULL. Dein Vorschlag keinen Sinn macht, und nicht nur das, Pg könnte nur dann tatsächlich den index verwenden, wenn die Abfrage auch aus dem gleichen Ausdruck.
  • Stimmt - ich will nur, um eine Unterscheidung zwischen Null und nicht-Null-Werte, I don ' T care über den tatsächlichen Wert.

InformationsquelleAutor Adam Matan | 2015-08-12
Schreibe einen Kommentar