【问题标题】:How to join a large table (1M+) with a reference table in Teradata?如何将大表(1M+)与 Teradata 中的引用表连接起来?
【发布时间】:2015-06-20 18:13:06
【问题描述】:

我有以下 2 个表 -
tableA(300 万行;这是“数据表”)
tableB(2300 行;这个是“参考表”)

架构 -
tableA - id、field1、field2、field3、num_of_actual_items、num_of_possible_items
tableB - field1、field2 , field3, num_of_possible_items

背景
tableA 中有 14000 个唯一的 id
所以 [select count(distinct id) from tableA] 给出 14000 作为答案。

field1, field2field3 有 2300 种可能的组合,所有这些组合及其对应的 num_of_possible_items 都列在 tableB 中

num_of_actual_items 为给定的“field1-field2-field3 时,

tableA 不包含 id 的条目" 组合为 0。这是我要解决的问题。

理想情况下,tableA 应该有 32,200,000 行(14000 ids X 2300 个组合)。我的查询如下:

select A1.id, A1.field1, A1.field2, A1.field3, A1.num_of_actual_items, 
A1.num_of_possible_items
from tableA A1
union
select distinct A2.id, B.field1, B.field2, B.field3, 0 as 
num_of_actual_items, B.num_of_possible_items
from tableA A2, tableB B
where A2.field1 || A2.field2 || A2.field3 <> B.field1 || B.field2 || 
B.field3

上述查询将为每个 id 和对应的 field1-field2-field3 组合提供 2 行(一个用于真实的 num_of_actual_items 和一个用于人为添加的 0 条目) .
在下一步中,可以通过聚合(num_of_actual_items 的最大值)删除重复的行,问题就解决了。

但是,此解决方案仅适用于 tableA 具有 5000-10000 行的情况。当我尝试使用完整的 300 万行时,我收到“假脱机空间不足”错误。

上述查询实际上填充了一个可变表,我在 field1、field2 和 field3 上创建了一个索引,并收集了所有 3 个的统计信息。

有什么想法可以优化/更改如此大量的查询吗?
我正在使用 Teradata。

编辑:我添加了 Andrew(限制不匹配的行)和 dnoeth(仅返回不同的行而不是所有行)的建议,但仍然无济于事。
我一直在用完线轴空间。

【问题讨论】:

  • 你不能在第二个查询中添加一个约束,以便只返回不匹配的行吗?类似于a2.field1 || a2.field2 || a2.field3 &lt;&gt; b.field1 || b.field2 || b.field3.
  • 感谢您的指点。这种改变仍然没有帮助。我又用完了假脱机空间。

标签: sql join teradata large-data


【解决方案1】:

联合中的第二个查询是一个 CROSS 连接,它在不同之前产生 2300 * 3000000 行。

您必须在加入前申请distinct

select A1.id, A1.field1, A1.field2, A1.field3, A1.num_of_actual_items, 
A1.num_of_possible_items
from tableA A1
union ALL
select A2.id, B.field1, B.field2, B.field3, 0 as num_of_actual_items,  
B.num_of_possible_items
from (select distinct id from tableA) A2, tableB B

【讨论】:

  • 感谢您的指点。即使在加强了第二个查询之后,我的假脱机空间也用完了。
  • 您可以将UNION 替换为UNION ALL,这将减少spool 的使用。如果您的线轴仍然用完,您应该与您的 DBA 联系。
  • 没有骰子。事实上,仅仅执行第二个查询就会导致假脱机空间用完。我想我会尝试将它移到 Hadoop/Hive 上,看看它是否能解决我的问题。不过感谢您的帮助。
猜你喜欢
  • 2018-06-16
  • 2014-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-17
  • 2011-07-25
  • 1970-01-01
相关资源
最近更新 更多