sql >> Base de Datos >  >> RDS >> PostgreSQL

Limitaciones prácticas de los índices de expresión en PostgreSQL

Nunca jugué con hstore, pero hago algo similar cuando necesito una columna EAV, por ejemplo:

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

La limitación al hacerlo es que debe ser explícito en su consulta para hacer uso de ella, es decir, esta consulta no usaría el índice anterior:

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

Pero este:

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

En tu ejemplo, probablemente debería ser más como:

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

Esto debería evitar agregar una referencia al índice cuando no hay una entrada de tamaño. Dependiendo de la versión de PG que esté utilizando, es posible que deba modificar la consulta de la siguiente manera:

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

Otra gran diferencia entre el índice regular y el parcial es que este último no puede imponer una restricción única en una definición de tabla. Esto tendrá éxito:

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

Lo siguiente no:

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

Pero esto:

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