sql >> Databasteknik >  >> RDS >> PostgreSQL

Praktiska begränsningar för uttrycksindex i PostgreSQL

Jag har aldrig spelat med hstore, men jag gör något liknande när jag behöver en EAV-kolumn, t.ex.:

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

Begränsningen för att göra det är att du måste vara tydlig i din fråga för att kunna använda den, dvs. den här frågan skulle inte använda ovanstående index:

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

Men den här skulle:

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

I ditt exempel borde det troligen vara mer som:

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

Detta bör undvika att lägga till en referens till indexet när det inte finns någon storleksinmatning. Beroende på vilken PG-version du använder kan frågan behöva ändras så här:

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

En annan stor skillnad mellan vanligt och partiellt index är att det senare inte kan tvinga fram en unik begränsning i en tabelldefinition. Detta kommer att lyckas:

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

Följande kommer inte:

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

Men det här kommer:

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



  1. ORA-00913:för många värden när du använder fall när

  2. Är det ok att använda oracle 11g-klient med en 10g-server?

  3. dynamisk sql-fel:'CREATE TRIGGER' måste vara den första satsen i en frågebatch

  4. ERROR 1064 (42000):Du har ett fel i din SQL-syntax; Vill konfigurera ett lösenord som root som användaren