sql >> Database >  >> RDS >> PostgreSQL

Praktische beperkingen van expressie-indexen in PostgreSQL

Ik heb nog nooit met hstore gespeeld, maar ik doe iets soortgelijks als ik een EAV-kolom nodig heb, bijvoorbeeld:

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

De beperking daarbij is dat u expliciet moet zijn in uw zoekopdracht om er gebruik van te maken, d.w.z. deze zoekopdracht zou geen gebruik maken van de bovenstaande index:

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

Maar deze zou:

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

In jouw voorbeeld zou het waarschijnlijk meer moeten zijn als:

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

Dit moet voorkomen dat een verwijzing naar de index wordt toegevoegd als er geen invoer voor de grootte is. Afhankelijk van de PG-versie die u gebruikt, moet de zoekopdracht mogelijk als volgt worden gewijzigd:

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

Een ander groot verschil tussen reguliere en gedeeltelijke index is dat de laatste geen unieke beperking in een tabeldefinitie kan afdwingen. Dit gaat lukken:

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

Het volgende niet:

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

Maar dit zal:

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



  1. De implementatie van Amazon Auroras Multi-AZ begrijpen

  2. Geen SPU meer

  3. Resultatenset retourneren op basis van andere rijen

  4. Waarom is XAMPP niet geschikt voor productie?