【问题标题】:Doing a join of two tables after having sampled them对两个表进行采样后进行连接
【发布时间】:2017-03-21 02:08:52
【问题描述】:

在连接两个表后,我需要一个示例,例如:

SELECT  *
from 
A left join B 
on A.col=B.col
sample 1000000

问题是 A 和 B 很大(超过 30 亿行),当我尝试连接时,我的假脱机空间已用完。

有没有办法在样本之后进行连接,以便连接较小的表(例如,从 A 和 B 中选择 10,000,000 个样本,内部连接它们,然后从连接中选择 1,000,000,希望我能做到至少 1,000,000 行?)

附: 我正在使用 teradata

【问题讨论】:

  • (1) A和B是什么关系? 1:1? 1:N? (2)A和B的主要指标是什么?
  • 您能否将 1000000 A 采样到临时表中 SELECT * INTO #A FROM A SAMPLE 1000000 然后 SELECT * FROM #A left join B on A.Col = B.col
  • 您在这里已经有了很好的答案,但如果您回答@Dudu-Markovitz 的问题,您将可以改进答案。
  • A 和 B 是两张表,但没有严格的 1:1 对应关系,但是它们有很大的交集。我只对这个路口的采样感兴趣。
  • 连接中使用的列是两个表之一的主索引吗?

标签: sql join teradata


【解决方案1】:

您可以按照您的建议做,在派生表中应用SAMPLE

SELECT  *
from 
 (
  SELECT * FROM A 
  SAMPLE 10000000
 ) AS A
left join B 
on A.col=B.col

类似的内连接

SELECT  *
from 
 (
  SELECT * FROM A
  SAMPLE 100000000 -- larger sample than needed 
 ) AS A
join B 
on A.col=B.col
sample 10000000

【讨论】:

    【解决方案2】:
    SELECT * INTO #A FROM A SAMPLE 1000000;
    

    紧随其后

    SELECT * FROM #A left join B on #A.Col = B.col;
    

    我记住,在您的原始查询中,您似乎要求 A 的任何 1000000 个,然后将 LEFT JOIN 连接到有批处理的 B,或者如果不匹配则为 B 返回 NULL - 我' m 假设它也是 1-1 或 1-0 连接 - 否则它不符合您的原始想法

    【讨论】:

    • SQL Server 语法,Teradata 问题。
    • @DuduMarkovitz - 我有点猜测他可能有什么样的语法
    • 在这种情况下最好使用伪代码。 # 作为临时表的指示是特定于 SQL Server 的。 CTAS 上下文中的INTO 也特定于 SQL Server。
    【解决方案3】:

    您可以尝试使用SAMPLE 加入子查询来限制大小:

    SELECT *
    FROM
    (SELECT * FROM A SAMPLE 1000) t1
    LEFT JOIN
    (SELECT * FROM B SAMPLE 1000) t2
        ON t1.col = t2.col
    

    【讨论】:

    • (1) PO 使用 LEFT JOIN (2) 在统计上这个查询不会返回任何行
    • @DuduMarkovitz 评论中的第 (2) 点在您编辑后是否仍然有效?您从 A 中随机抽取 1000 行(超过 30 亿行),从 B 中抽取 1000 行。找到匹配项的机会(即使 B 与 A 是 1:1)似乎很小。
    • @Insac 为什么匹配连接的概率会随着样本量的减小而减小?它不应该。因此,如果大多数记录在完全连接中不匹配,那么在我的回答中,大多数记录也不匹配。这个想法是让样本代表原始数据问题。
    • 我可能在这里遗漏了一些东西。我得到的是 OP 想要一个大连接的样本,并且由于他没有足够的线轴,他会尝试分别对两个表进行采样然后加入它们。在初始查询中,如果 A 有一行 col=10,B 有一行 col=10,如果该行在样本中,它将出现在结果中。在您的查询中,要出现在结果集中,col=10 必须从 A 和 B 独立采样,这不太可能(我假设为 1/3000000^2)
    • 我尝试实现一个小测试 (pastebin.com/9Xkcmx6g)。如果我们正在分析自联接,您的方法将始终有效。但是,由于 A 和 B 是不同的表,它们似乎是独立采样的,这显然会引入不属于原始数据问题的匹配问题。
    【解决方案4】:
    SELECT  *
    from 
    (select * from A sample 1000000) A left join B 
    on A.col=B.col
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-23
      • 2011-05-25
      • 2018-01-10
      • 1970-01-01
      相关资源
      最近更新 更多