使用分区(postgres)连接大表的最佳实践?

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

我正在对两个巨大的客户资料表进行身份解析。我想加入他们的客户姓氏,以及我已经准备好的昵称变体的名字:

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

sql postgresql join partitioning
© www.soinside.com 2019 - 2024. All rights reserved.