是否可以使用另一个表中的字段来约束部分索引?
即。假设我有两个表:
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
很小,有<1000万行。我希望能够快速查询table_a
,但是主键索引和id_b_ind
太大而无法有效使用。如果可以使用filter
中的table_b
列来限制索引,则可以更快地完成此操作,因为id_b
中超过99%的标记为“已过滤”。是否可以使用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
的物化视图,该视图仅包含具有filter = FALSE的子集,但这似乎浪费了空间。