任何人都有窍门让计划者支持我的部分杜松子酒索引?
这是我正在使用的架构。
create table dude (
id integer primary key,
first_name text,
last_name text,
house_id integer,
...)
alter table dude
add constraint dude_house_id_fkey
foreign key (house_id) references house (id);
create index ix_dude_house_id on dude (house_id);
create index ix_dude_first_last_name_tsv on dude
using gin (to_tsvector('my_tsconfig'::regconfig, (first_name::text || ' '::text) || last_name::text)
where house_id is not null and first_name is not null and last_name is not null;
dude
有大约400万条记录,但其中一些记录为null first_name,last_name或email_id。
所以我试图使用查询
来搜索tsv索引select *
from dude
where
to_tsquery('my_tsconfig'::regconfig, 'george & michael'::text)
@@ (to_tsvector('my_tsconfig'::regconfig, (first_name::text || ' '::text) || last_name::text))
and house_id is not null
and first_name is not null
and last_name is not null;
我正在制定的计划是
Index Scan using ix_person_house_id on dude (cost=0.45..46673651.54 rows=8 width=327)
Index Cond: (house_id IS NOT NULL)
Filter: ((first_name IS NOT NULL) AND (last_name IS NOT NULL) AND ('''george'' & ''michael'''::tsquery @@ to_tsvector('my_tsconfig'::regconfig, (((first_name)::text || ' '::text) || (last_name)::text))))
规划者偏爱house_id上的btree,导致查询速度非常慢。我怀疑这里的问题是我没有正确指定表达式,所以规划者不能考虑使用部分索引。
我应该补充一点,我已经分析了表格,我得到了完全相同的计划。