sql >> Database teknologi >  >> RDS >> PostgreSQL

Praktiske begrænsninger af udtryksindekser i PostgreSQL

Jeg har aldrig spillet med hstore, men jeg gør noget lignende, når jeg har brug for en EAV-søjle, f.eks.:

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

Begrænsningen ved at gøre det er, at du skal være eksplicit i din forespørgsel for at gøre brug af den, dvs. denne forespørgsel ville ikke gøre brug af ovenstående indeks:

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

Men denne ville:

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

I dit eksempel burde det sandsynligvis være mere som:

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

Dette bør undgå at tilføje en reference til indekset, når der ikke er nogen størrelsesindtastning. Afhængigt af den PG-version, du bruger, skal forespørgslen muligvis ændres sådan:

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

En anden stor forskel mellem regulært og delvist indeks er, at sidstnævnte ikke kan håndhæve en unik begrænsning i en tabeldefinition. Dette vil lykkes:

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

Følgende vil ikke:

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

Men dette vil:

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



  1. Find dublerede strenge i databasen

  2. php-mysql-versionen er i konflikt med Mysql-serveren

  3. Konfigurer JPA/Hibernate/PostgreSQL uden XML

  4. Parsing af OpenXML med flere elementer af samme navn