使用Postgres 10.5中的联接表的部分索引

时间:2019-03-20 15:48:09

标签: sql postgresql indexing b-tree postgresql-10

是否可以使用另一个表中的字段来约束部分索引?

即。假设我有两个表:

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的子集,但这似乎浪费了空间。

0 个答案:

没有答案