2015-04-14 32 views
0

我有以下2表 -
TABLEA(3萬行;這是 「數據表」)
tableB的(2300行;這是 「參考表」)如何使用Teradata中的參考表來加入大表(1M +)?

架構 -
TABLEA - ID,字段1,字段2,字段3,num_of_actual_items,num_of_possible_items
tableB的 - 字段1,字段2,字段3,num_of_possible_items

背景
有14000個獨特IDS表A
因此,[tableA]中的[select count(distinct id)]給出14000作爲答案。

還有的field1的2300個可能的組合,場2場3和他們都與它們對應的num_of_possible_itemstableB的上市。

TABLEA不包含的ID條目時num_of_actual_items對於給定的「字段1字段2字段3」組合爲0 這就是我試圖解決。

理想TABLEA應該有3220萬行(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 

上述查詢會給2行的每個ID和對應FIELD1-FIELD2字段3組合(一個用於真實num_of_actual_items和一個用於人工添加0條目)。
在下一步中,可以通過執行聚合來刪除重複的行(最大值爲num_of_actual_items),問題就解決了。

但是,此解決方案僅適用於表A具有5000-10000行時。當我用300萬行進行嘗試時,我得到一個「超出假脫機空間」的錯誤。

上面的查詢實際上填充揮發性表,我已經創建了一個FIELD1指數,場2 &字段3,並在所有3

任何想法收集統計我能做些什麼來優化/更改查詢這樣的大量?
我正在使用Teradata。

編輯:我添加了Andrew的建議(限制行不匹配)和dnoeth(只返回不同的行而不是所有),但仍然無濟於事。
我一直用完假冒空間。

+0

你能不能添加約束你的第二個查詢,讓您只返回不匹配的行?類似於「a2.field1 ||」的地方a2.field2 || a2.field3 <> b.field1 || b.field2 || b.field3'。 – Andrew

+0

感謝您的指針。這一改變仍然無濟於事。我又跑出了假脫機空間。 – user3777422

回答

3

聯合中的第二個查詢是一個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 
+0

謝謝你的指針。即使在收緊第二個查詢之後,我用完了假脫機空間。 – user3777422

+0

您可以用'UNION ALL'替換'UNION',這將減少線軸的使用。如果你仍然沒有使用假脫機程序,你應該與你的DBA交談。 – dnoeth

+0

沒有骰子。事實上,僅僅執行第二個查詢會導致假脫機空間耗盡。猜猜我會試着將它移到Hadoop/Hive,看看它是否能解決我的問題。感謝您的幫助。 – user3777422