2017-03-21 89 views
1

我正在處理兩個包含120,000,000條記錄的SQL表。很少有記錄(大約60,000)在兩張表格中重複。兩張桌子的結構都一樣。UNION與FULL OUTER JOIN的執行細節

每個表格有40列。我需要將記錄合併到一個表中。

我知道兩種方法來做到這一點(兩者都給我所需的輸出)。我想知道哪些方法更好,請問有更好的方法嗎?

方法1:

SELECT * INTO Table1_copy FROM Table1 

DROP TABLE Table1 

SELECT * INTO Table1 FROM Table1_copy 
UNION 
SELECT * FROM Table2 

DROP TABLE Table1_copy 

方法2:

INSERT INTO Table1 <br> 
SELECT Table2.Col1, Table2.Col2 <br> 
FROM TAB1 <br> 
FULL OUTER JOIN Table2 <br> 
ON Table1.Col1 = Table2.Col1 AND Table1.Col2 = Table2.Col2 <br> 
WHERE Table1.Col1 IS NULL AND Table1.Col2 IS NULL 

UNION使用似乎是一個更好的選擇,但任何人都能夠解決各地有選擇大型數據集到空間問題一張新桌子並放下它。120,000,000條記錄只是一個例子。還有其他表的記錄數量較多。

+0

可能使用[使用聯盟或聯盟 - 更快的重複](http://stackoverflow.com/questions/2309936/use-a-union-or-a-join-what-is-faster) – SaggingRufus

+1

UNION ALL可能比UNION更快。 – jarlh

+0

我不確定爲什麼你想在'LEFT JOIN'做你所需要的時候使用'FULL OUTER JOIN'。另外,不需要檢查Col1和Col2是否都是NULL。 NULL值不等於NULL,因此如果Col1爲NULL,則Table1不能等於Table2。只需使用'WHERE Table1.Col1 IS NULL' –

回答

1

我不明白你爲什麼使用第三個表。

我會去像這樣的東西:

INSERT INTO Table1 (<Columns list>) 
SELECT <Columns list> FROM Table2 
EXCEPT 
SELECT <Columns list> FROM Table1 

如果只是不夠快,或者用不存在,並添加相關的索引。

1

我想我會做的事:

SELECT * INTO Table1 
FROM Table1_copy; 

CREATE INDEX idx_table1_copy_2 ON table1_copy(col1, col2); 

INSERT INTO table1 (. . .) 
    SELECT * 
    FROM Table2 t2 
    WHERE NOT EXISTS (SELECT 1 
         FROM table1_copy t1 
         WHERE t1.col1 = t2.col1 AND t1.col2 = t2.col2 
        ); 

我要指出,你所描述的兩種方法是不等價的。 UNION刪除表和表之間的重複項,所以新表中的行全部不同。 FULL OUTER JOIN不會刪除表內的重複項。

+0

'全外聯接不會刪除表內的重複' - 好點戈登。我沒有在每個表格中重複。 – hmmm