其实就是一个主表,里面有两个指向明细表的索引。
create table pairs1(id serial primary key, ai int not null, bi int not null);
create table pairs2(id serial primary key, ai int not null, bi int not null);
create table items1(id serial primary key, name text not null);
create table items2(id serial primary key, name text not null);
create view pairs as select * from pairs1 union all select * from pairs2;
create view items as select * from items1 union all select * from items2;
create view viewpairs as select t0.id, t1.id as aid, t1.name as aname, t2.id as bid, t2.name as bname from pairs t0 left join items t1 on t0.ai=t1.id left join items t2 on t0.bi=t2.id;
$ explain select * from viewpairs;
QUERY PLAN
-------------------------------------------------------------------------------------------------------
Merge Right Join (cost=5319.09..15347.88 rows=658063 width=76)
Merge Cond: (items1_1.id = pairs1.bi)
-> Merge Append (cost=0.32..151.82 rows=2540 width=36)
Sort Key: items1_1.id
-> Index Scan using items1_pkey on items1 items1_1 (cost=0.15..63.20 rows=1270 width=36)
-> Index Scan using items2_pkey on items2 items2_1 (cost=0.15..63.20 rows=1270 width=36)
-> Sort (cost=5318.77..5448.31 rows=51816 width=44)
Sort Key: pairs1.bi
-> Merge Right Join (cost=326.20..1261.29 rows=51816 width=44)
Merge Cond: (items1.id = pairs1.ai)
-> Merge Append (cost=0.32..151.82 rows=2540 width=36)
Sort Key: items1.id
-> Index Scan using items1_pkey on items1 (cost=0.15..63.20 rows=1270 width=36)
-> Index Scan using items2_pkey on items2 (cost=0.15..63.20 rows=1270 width=36)
-> Sort (cost=325.88..336.08 rows=4080 width=12)
Sort Key: pairs1.ai
-> Append (cost=0.00..81.20 rows=4080 width=12)
-> Seq Scan on pairs1 (cost=0.00..30.40 rows=2040 width=12)
-> Seq Scan on pairs2 (cost=0.00..30.40 rows=2040 width=12)
(19 rows)
问了 ai ,提示在 pairs1 和 pairs2 中为 ai 和 bi 创建索引,但我总觉得有点不靠谱。
|