我有以下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(仅返回不同的行而不是全部),但仍然无效。
我的线轴空间不断用完。
答案 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