Postgresql:基于多个地址字段连接表的更有效方式

Posted

技术标签:

【中文标题】Postgresql:基于多个地址字段连接表的更有效方式【英文标题】:Postgresql: More efficient way of joining tables based on multiple address fields 【发布时间】:2020-03-03 20:40:37 【问题描述】:

我有一个表格,其中列出了两个连接值,ID 和 TaxNumber(TIN),看起来有点像这样:

IDTINMap

     ID    |     TIN
-------------------------
1234567890 |   654321
-------------------------
3456321467 |   986321
-------------------------
8764932312 |   245234

一个 ID 可以映射到多个 TIN,一个 TIN 可能映射到多个 ID,但是对于一个 ID、TIN 对,表有唯一约束。

此列表不完整,该表大约有 8000 行。我还有另一个表IDListing,其中包含大约 900 万个 ID 的元数据,包括姓名、地址、城市、州、邮政编码和 ID。

我要做的是构建一个扩展的 ID - TIN 地图。目前,我首先通过在 ID 字段中加入 IDTINMap 表和 IDListing 来执行此操作,这在 CTE 中给出了如下所示的内容,我现在将其称为 Step1

     ID    |     TIN     |    Name    |    Address    |     City     |    State    |    Zip
------------------------------------------------------------------------------------------------
1234567890 |   654321    | John Doe   | 123 Easy St   | Seattle      |     WA      |   65432
------------------------------------------------------------------------------------------------
3456321467 |   986321    | Tyler Toe  | 874 W 84th Ave| New York     |     NY      |   48392
------------------------------------------------------------------------------------------------
8764932312 |   245234    | Jane Poe   | 984 Oak Street|San Francisco |     CA      |   12345

然后我再次通过并再次加入IDListing 表,加入Step1 的地址、城市、州、邮编和名称都相同。我知道我可以做一些更复杂的事情,比如模糊匹配,但现在我们只关注精确匹配。在连接中,我将第 1 步中的 ID 保留为“ReferenceID”,保留 TIN,然后拥有所有匹配 ID 的另一列。我不保留任何地址/城市/州/邮编信息,只保留三个数字。

然后我可以返回并将所有不同的对插入到最终表中。

我已经通过查询尝试过这个,它可以工作并给我想要的结果。但是,查询比预期的要慢。我习惯于加入已编入索引的行(如 ID 或 TIN),但加入所有地址字段的速度很慢。有什么好的方法可以改善吗?单独加入每个字段比加入所有字段的 CONCAT() 更快(我已经尝试过)。我只是想知道是否有其他方法可以优化它。

【问题讨论】:

【参考方案1】:

将最终结果设为materialized view。当您需要更新数据时刷新它(每晚?每三个小时?)。然后将此视图用于您的正常操作。

【讨论】:

这是一个选项 - 但我并不担心在加入所有这些字段时是否有办法提高查询本身的性能,而不是担心频率我们必须这样做(因为查询需要大约 4 秒才能运行) 您可以对 (state, zip) 组合进行索引,甚至可以在这些组合之后添加地址,这可能会有所帮助。检查EXPLAIN ANALYZE 看看它是如何影响的。另外,几年前我使用 postgres 包来规范美国地址(使“First North Street”->“1st N St”)或类似的东西,它将使更多地址匹配。

以上是关于Postgresql:基于多个地址字段连接表的更有效方式的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL 连接(JOIN)

9.PostgreSQL的Join,Union,Null

PostgreSQL 中多个表的完全外连接

在 PostgreSQL 中基于多个字段更改(包括“不可见”)对行进行编号

POSTGRESQL:使用连接表的案例

无法编辑基于多个表的任何查询