PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Praktische Einschränkungen von Ausdrucksindizes in PostgreSQL

Ich habe noch nie mit hstore gespielt, aber ich mache etwas Ähnliches, wenn ich eine EAV-Spalte brauche, z. B.:

create index on product_eav (eav_value) where (eav_type = 'int');

Die Einschränkung dabei ist, dass Sie in Ihrer Abfrage explizit sein müssen, um sie zu verwenden, d. h. diese Abfrage würde den obigen Index nicht verwenden:

select product_id
from product_eav
where eav_name = 'size'
and eav_value = :size;

Aber dieses würde:

select product_id
from product_eav
where eav_name = 'size'
and eav_value = :size
and type = 'int';

In Ihrem Beispiel sollte es wahrscheinlich eher so aussehen:

create index on product ((data->'size')::int) where (data->'size' is not null);

Dadurch sollte vermieden werden, dass ein Verweis auf den Index hinzugefügt wird, wenn kein Größeneintrag vorhanden ist. Abhängig von der PG-Version, die Sie verwenden, muss die Abfrage möglicherweise wie folgt geändert werden:

select product_id
from products
where data->'size' is not null
and data->'size' = :size;

Ein weiterer großer Unterschied zwischen regulären und partiellen Indizes besteht darin, dass letztere keine eindeutige Einschränkung in einer Tabellendefinition erzwingen können. Das wird gelingen:

create unique index foo_bar_key on foo (bar) where (cond);

Folgendes nicht:

alter table foo add constraint foo_bar_key unique (bar) where (cond);

Aber das wird:

alter table foo add constraint foo_bar_excl exclude (bar with =) where (cond);