我正在对两个巨大的客户表进行标识解析,我想根据客户的姓氏、名字以及昵称的变体将它们连接起来,这些都是我已经准备好的:
SELECT * FROM t1
INNER JOIN t2
ON t1.lname = t2.lname
AND t1.fname ~ t2.fname_regex
表非常大,所以我想我应该按字母顺序将它们分开。但是即使在将t1和t2缩小到以字母"a"开头的姓氏之后,我在t1中有671k行,在t2中有203k行-上面的查询在许多小时内都无法完成。
基本上,我想做的是将表划分为块,比如67k/20k(具有这种限制的查询运行在合理的时间内),并将块连接到块。
例如,姓氏在(Aaa-Abg)中的t1块只需要对照具有相同字母名称范围的t2块来检查。
- 在我看来,这可能是一个非常常见的场景,所以我想知道是否有关于这种分区/连接的最佳实践。**
有没有什么方法可以告诉postgres我想把我的表划分成某个列上的字母块,这样它就可以自动地准备分区和索引,并一个块接一个块地执行连接?
- 另外,我在Postgres上9.4.26,对此无能为力 *
编辑:
既然问题似乎主要出在正则表达式上,那么让我来解释一下我在这里尝试实现的目标。我想按名字匹配,但要按昵称匹配,以便"Robert"与"Bob"等匹配。因此,对于每个fname,我使用外部昵称数据集构建了一个fname_regex字符串,看起来像"(^robert$|^bob$|^rob$)"
。没想到它会对性能造成如此严重的影响。如果这种方法无法挽救,那么,我们建议以甚么方式来落实这逻辑呢?
编辑2:
我在这里提出了一个新问题:Joining two tables by column with several possible values. Improving performance
1条答案
按热度按时间hgb9j2n61#
如果正则表达式是您的瓶颈,那么您所能希望的就是并行查询(支持的PostgreSQL版本提供),这将允许您在多个内核上并行运行查询。