Sql 如何在Teradata中将一个大表(1M+)与一个参考表连接起来?

Sql 如何在Teradata中将一个大表(1M+)与一个参考表连接起来?,sql,join,teradata,large-data,Sql,Join,Teradata,Large Data,我有以下两张桌子- 表a 300万行;这是数据表 表B 2300行;这是参考表 模式- 表A-id、字段1、字段2、字段3、实际项目数、可能项目数 表B-字段1、字段2、字段3、可能项目的数量 背景 表A中有14000个唯一ID。 因此[select countdistinct id from tableA]给出14000作为答案 有2300个字段1、字段2和字段3的可能组合,表B中列出了所有这些组合及其相应的可能项目数 当给定field1-field2-field3组合的实际项目数为0时,表a

我有以下两张桌子- 表a 300万行;这是数据表 表B 2300行;这是参考表

模式- 表A-id、字段1、字段2、字段3、实际项目数、可能项目数 表B-字段1、字段2、字段3、可能项目的数量

背景 表A中有14000个唯一ID。 因此[select countdistinct id from tableA]给出14000作为答案

有2300个字段1、字段2和字段3的可能组合,表B中列出了所有这些组合及其相应的可能项目数

当给定field1-field2-field3组合的实际项目数为0时,表a不包含id项。这就是我试图解决的问题

理想情况下,表A应具有32200000行14000 ID 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行,一行用于实际项目的实际数量,另一行用于人为添加的0条目。 在下一步中,可以通过对实际项目的num_进行聚合max来删除重复的行,问题就解决了

但是,此解决方案仅在tableA有5000-10000行时有效。当我在300万行中尝试时,我得到了一个假脱机空间不足的错误

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

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

编辑:我添加了Andrew的建议,限制不匹配的行,dnoeth只返回不同的行,而不是全部,但仍然无效。
我一直在用尽假脱机空间。

union中的第二个查询是交叉连接,它会在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

union中的第二个查询是交叉联接,它在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

union中的第二个查询是交叉联接,它在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

union中的第二个查询是交叉联接,它在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

您不能为第二个查询添加一个约束,以便只返回不匹配的行吗?类似于where a2.field1 | | | a2.field2 | | a2.field3 b.field1 | b.field2 | | b.field3。谢谢你的指针。这种改变仍然没有帮助。我又用完了假脱机空间。您不能为第二个查询添加一个约束,以便只返回不匹配的行吗?类似于where a2.field1 | | | a2.field2 | | a2.field3 b.field1 | b.field2 | | b.field3。谢谢你的指针。这种改变仍然没有帮助。我又用完了假脱机空间。您不能为第二个查询添加一个约束,以便只返回不匹配的行吗?类似于where a2.field1 | | | a2.field2 | | a2.field3 b.field1 | b.field2 | | b.field3。谢谢你的指针。这种改变仍然没有帮助。我又用完了假脱机空间。您不能为第二个查询添加一个约束,以便只返回不匹配的行吗?类似于where a2.field1 | | | a2.field2 | | a2.field3 b.field1 | b.field2 | | b.field3。谢谢你的指针。这种改变仍然没有帮助。我的线轴空间又用完了。谢谢你的指针。即使在收紧第二个查询之后,我的假脱机空间也用完了。您可以用UNION ALL替换UNION,这将减少假脱机的使用。如果你的线轴还没用完,你应该和你的DBA谈谈。不要冒险。事实上,仅执行第二个查询就会导致spool空间耗尽。我想我会尝试将它移动到Hadoop/Hive,看看它是否解决了我的问题。谢谢你的帮助,谢谢你的指点。即使在收紧第二个查询之后,我的假脱机空间也用完了。您可以用UNION ALL替换UNION,这将减少假脱机的使用。如果你的线轴还没用完,你应该和你的DBA谈谈。不要冒险。事实上,仅执行第二个查询就会导致spool空间耗尽。我想我会尝试将它移动到Hadoop/Hive,看看它是否解决了我的问题。谢谢你的帮助,谢谢你的指点。即使在收紧第二个查询之后,我的假脱机空间也用完了。您可以用UNION ALL替换UNION,这将减少假脱机的使用。如果你的线轴还没用完,你应该和你的DBA谈谈。不要冒险。事实上,仅执行第二个查询就会导致spool空间耗尽。我想我会尝试将它移动到Hadoop/Hive,看看它是否解决了我的问题。谢谢你的帮助,谢谢你的指点。即使在收紧第二个查询之后,我的假脱机空间也用完了。您可以用UNION ALL替换UNION,这将减少假脱机
用法如果你的线轴还没用完,你应该和你的DBA谈谈。不要冒险。事实上,仅执行第二个查询就会导致spool空间耗尽。我想我会尝试将它移动到Hadoop/Hive,看看它是否解决了我的问题。谢谢你的帮助。