PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Limitations pratiques des index d'expression dans PostgreSQL

Je n'ai jamais joué avec hstore, mais je fais quelque chose de similaire quand j'ai besoin d'une colonne EAV, par exemple :

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

La limitation est que vous devez être explicite dans votre requête pour l'utiliser, c'est-à-dire que cette requête n'utilisera pas l'index ci-dessus :

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

Mais celui-ci :

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

Dans votre exemple, cela devrait probablement ressembler davantage à :

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

Cela devrait éviter d'ajouter une référence à l'index lorsqu'il n'y a pas d'entrée de taille. Selon la version de PG que vous utilisez, la requête peut devoir être modifiée comme suit :

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

Une autre grande différence entre l'index régulier et l'index partiel est que ce dernier ne peut pas appliquer une contrainte unique dans une définition de table. Cela réussira :

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

Ce qui suit ne le sera pas :

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

Mais ceci :

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