Практические ограничения индексов выражений в PostgreSQL - PullRequest
4 голосов
/ 07 июня 2011

Мне нужно хранить данные, используя тип HSTORE и индекс по ключу.

CREATE INDEX ix_product_size ON product(((data->'Size')::INT))
CREATE INDEX ix_product_color ON product(((data->'Color')))
etc.

Каковы практические ограничения использования индексов выражений? В моем случае может быть несколько сотен различных типов данных, а следовательно, несколько сотен индексов выражений. Каждый запрос вставки, обновления и выбора должен обрабатываться по этим индексам, чтобы выбрать правильный.

1 Ответ

4 голосов
/ 07 июня 2011

Я никогда не играл с hstore, но я делаю что-то похожее, когда мне нужен столбец EAV, например:

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

Ограничение при этом заключается в том, что вам нужно явно указывать в своем запросеиспользуйте его, то есть этот запрос не будет использовать вышеуказанный индекс:

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

Но этот запрос будет:

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

В вашем примере он, скорее всего, будет выглядеть так:

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

Во избежание добавления ссылки на индекс следует избегать добавления ссылки на индекс.В зависимости от версии PG, которую вы используете, запрос может быть изменен следующим образом:

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

Еще одно большое различие между обычным и частичным индексом заключается в том, что последний не может применять уникальное ограничение в определении таблицы.Это будет успешно:

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

Следующее не будет:

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

Но это будет:

alter table foo add constraint foo_bar_excl exclude (bar with =) where (cond);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...