用几个可能的值按列连接两个表。提高性能

问题描述 投票:0回答:1

决定重做这个问题,因为以前的方法不是最优的。

我有两个客户表,t1 和 t2(分别为 27M、7M 行)。每个表都有姓氏、名字和一堆其他个人数据。我在做身份解析,所以我想先通过匹配名字加入他们,然后再看其他列来确定他们是否是同一个人。

我想说明一个事实,即当两个表使用昵称时,同一个人的名字可能不同。

使用外部数据集,我在 t2 中创建了一个额外的昵称列,它是一个数组,例如,如果 fname2 是 'robert',那么昵称是 ['robert','rob','bob']。它总是至少有一个元素,即 fname2 本身。

加入这个的查询是:

SELECT *
FROM t1
JOIN t2 ON t1.lname1= t2.lname2
AND t1.fname1 = ANY(t2.nicknames)

但是,我有兴趣通过为此任务使用适当的索引和分区来最大化性能。

我如何解释数据集可以分成互斥的块(按字母顺序),只需要相互比较这一事实?

查询本身运行时间太长,但如果我过滤 t1 和 t2 以仅包含以“A”开头的姓氏,则它运行不到 2 分钟。

**我想做的是捕捉这个逻辑,几乎就像所有字母的 for 循环。我怎样才能告诉 postgres 像那样按字母顺序拆分表格并且只将相应的块彼此连接起来?

或者更简单,如果不能用这个版本完成,我将如何编写一个“for-loop”来手动执行此操作?**

我也有兴趣找出这种问题的名称,要搜索的关键字是什么,以及我可以在哪里阅读并找出推荐的做法。

不幸的是,我仍在使用 Postgres 9.4,无法更改...

sql postgresql join indexing partition
1个回答
0
投票

检查场景一:

SELECT t1.*,t2.* FROM t1 JOIN t2 ON t1.lname1= t2.lname2;

检查场景2:

SELECT t1.*,t2.* FROM t1,t2 where t1.lname1=t2.lname2;

检查场景 3:

SELECT t1.*,(select t2.lname2 from t2 where t2.lname2=t1.lname1) FROM t1;
© www.soinside.com 2019 - 2024. All rights reserved.