postgresql 通过具有多个可能值的列连接两个表,提高性能

5uzkadbs  于 2023-03-01  发布在  PostgreSQL
关注(0)|答案(1)|浏览(150)

由于之前的方法不是最佳的,因此决定重新提问。
我有两个客户表t1和t2(分别为27M和7M行)。每个表都有姓、名和一堆其他个人数据。我正在进行标识解析,所以我想首先通过匹配名称来连接它们,然后查看其他列以确定它们是否是同一个人。
我想说明这样一个事实,即当两个表使用昵称时,同一个人可能有不同的名字。
使用一个外部数据集,我在t2中创建了一个额外的nickname列,它是一个数组,例如,如果fname2是'robert',那么nickname就是['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循环”来手动完成这一点?**
我还想知道这类问题叫什么,需要搜索的关键词是什么,以及在哪里可以阅读这方面的内容并找出推荐的实践。
我仍然不幸地使用Postgres 9.4,不能改变那...

vbkedwbf

vbkedwbf1#

检查场景1:

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;

相关问题