进行多个表的左联接时出现雪花“爆炸联接”问题

时间:2020-09-30 19:25:28

标签: left-join snowflake-cloud-data-platform

我正在尝试在多个表上进行一些左联接,并面临以下问题。

表格行数

Table 1: 1.6M
Table 2: 1.7M
Table 3: 1.5M

当我使用表1和表2进行左联接并进行以下查询时,我得到的数据计数为1.8 M(可接受):

SELECT Table1.ID1, Table1.ID2, Table2.Name, Table2.City
FROM Table1
LEFT JOIN Table2
    ON Table1.ID1 = Table2.ID1
    AND Table1.ID2 = Table2.ID2
    AND Table1.Source_System = Table2.Source_System
;

类似地,当我使用表1和3进行左联接并进行以下查询时,我得到的数据计数为1.9 M(可接受):

SELECT Table1.ID1, Table1.ID2, Table3.Name, Table3.City 
FROM Table1
LEFT JOIN Table3
    ON Table1.ID1 = Table3.ID1 
    AND Table1.ID2 = Table3.ID2
    AND Table1.Source_System = Table3.Source_System
;

但是当我使用表1、2和3进行左联接并进行以下查询时,我得到的数据计数为11.9 G(问题):

SELECT 
    Table1.ID1, Table1.ID2,
    Table2.Name, Table2.City,
    Table3.Name as Name1, Table3.City as City1
FROM Table1
LEFT JOIN Table2
    ON Table1.ID1 = Table2.ID1
    AND Table1.ID2 = Table2.ID2
    AND Table1.Source_System = Table2.Source_System
LEFT JOIN Table3
    ON Table1.ID1 = Table3.ID1
    AND Table1.ID2 = Table3.ID2
    AND Table1.Source_System = Table3.Source_System
;

3 个答案:

答案 0 :(得分:0)

当您的左联接产生的记录多于引用表的记录时,这应该是不可接受的!应该在您的加入条件和数据中发出警告信号。要么首先调查表中的那些记录以免首先发生,要么您需要继续调整SQL以满足产生准确引用表行数的干净联接。否则,很常见的是,当您面对此处时,左连接到具有少量重复记录的另一个表会产生指数行计数。

尝试在此处阅读这些问题,以帮助herehere

只需添加有关调查和查找这些行的信息,请使用以下SQL在每个表中查找具有相同ID1,ID2和Source_System列的行

即:-

Select ID1, ID2 ,Source_System, COUNT(*) AS NUM_RECORDS_DUPS
FROM TABLE1
GROUP BY ID1, ID2 , Source_System 
HAVING COUNT(*)>1  -- Filtering on duplicate rows that has more than a row satisfying the join condition

对每个表使用相同的内容来查找那些记录,然后添加另一个唯一条件/ 在连接键上聚合表或要求进行数据清理!这些记录

答案 1 :(得分:0)

您是否尝试过添加DISTINCT子句?

SELECT DISTINCT列,共选择 从表1 左连接表2 ... 在...上左加入表3

我认为这是在发生什么事,因为您有一些愚蠢的人,而他们却加入了另一组巨人的愚蠢者。

答案 2 :(得分:0)

因此,您似乎已经假设table1和table2中的数据以1:1的比率合并,并且还假设table1和table3也是1:1的比率,因此假设当这三个表合并时,该比率应为再次以1:1的顺序

但是,如果您在表1中的一半条目不在表2中,以获得1.8M的结果,则必须复制公共行>增加的2.0倍。如果我们将不匹配的一半更改为不匹配的十分之一,则必须有> 10.0个重复项。因此,要获得4级的增长,似乎您只有第100个匹配项,但重复项大于100.0,当交叉连接时,可以得到10,000个增长行。

可以通过以下方式查看:

SELECT Table1.ID1, Table1.ID2, Table1.Source_System, counnt(*) as counts
FROM Table1
LEFT JOIN Table2
    ON Table1.ID1 = Table2.ID1
        AND Table1.ID2 = Table2.ID2
        AND Table1.Source_System = Table2.Source_System
GROUP BY 1,2,3 
ORDER BY counts DESC
;

这将显示总数不同的对,它们是组合爆炸的最差原因