如何在Teradata中将大表(1M +)与引用表连接?

时间:2015-04-14 23:33:00

标签: sql join teradata large-data

我有以下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 所以[tableA]中的[select count(distinct id)给出14000作为答案。

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

对于给定的&#34; field1-field2-field3 < num_of_actual_items

tableA 不包含 id 的条目/ EM>&#34;组合为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万行尝试它时,我得到了一个&#34;的假脱机空间&#34;错误。

上面的查询实际上填充了一个volatile表,我在field1,field2&amp;上创建了一个索引。 field3还收集了所有3的统计数据。

我可以做些什么来优化/更改如此大量的查询? 我正在使用Teradata。

编辑:我添加了Andrew的建议(限制不匹配的行)和dnoeth(仅返回不同的行而不是全部),但仍然无效。
我的线轴空间不断用完。

1 个答案:

答案 0 :(得分:3)

union中的第二个查询是CROSS连接,它在distinct之前产生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