Частичный индекс с использованием объединенной таблицы в Postgres 10.5 - PullRequest
0 голосов
/ 20 марта 2019

Можно ли ограничить частичный индекс, используя поле в другой таблице?

Т.е.. скажем, у меня есть две таблицы:

CREATE TABLE table_a (id_a integer NOT NULL, id_b integer NOT NULL, myfield text,
    CONSTRAINT table_a_pk PRIMARY KEY (id_a,id_b)
);

CREATE TABLE table_b (id_b integer NOT NULL, filter boolean,
    CONSTRAINT table_b_pk PRIMARY KEY (id_b)
);

CREATE INDEX id_b_ind ON public.table_a
    USING btree (id_b);

Таблица table_a огромна с миллиардами строк, тогда как table_b "мала" с <10 ​​миллионами строк. Я хочу иметь возможность быстро запрашивать <code>table_a, однако индекс первичного ключа и id_b_ind слишком велики, чтобы их можно было эффективно использовать. Это можно было бы сделать намного быстрее, если бы можно было ограничить индекс с помощью столбца filter в table_b, поскольку> 99% из id_b помечены как «отфильтрованные». Можно ли создать частичный индекс (или, возможно, раздел таблицы) в table_a, используя столбец из table_b?

Например:.

CREATE INDEX partial_id_b_ind ON table_a(id_b) JOIN table_b ON table_a.id_b = table_b.id_b WHERE filtered IS FALSE;

Единственное решение, о котором я могу подумать, - это создать материализованное представление table_a, которое содержит только подмножество с фильтром = FALSE, но это кажется пустой тратой пространства.

...