Можно ли ограничить частичный индекс, используя поле в другой таблице?
Т.е.. скажем, у меня есть две таблицы:
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, но это кажется пустой тратой пространства.