【发布时间】: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, field2 和 field3 有 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 <> b.field1 || b.field2 || b.field3. -
感谢您的指点。这种改变仍然没有帮助。我又用完了假脱机空间。
标签: sql join teradata large-data