UNION与FULL OUTER JOIN的执行详细信息

时间:2017-03-21 10:45:50

标签: sql sql-server join sql-server-2012 union

我正在处理两个每个包含120,000,000条记录的SQL表。两张表中很少有记录(约60,000)重复。两个表的结构是相同的。

每张表中有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条记录就是一个例子。还有其他表有更多的记录。

2 个答案:

答案 0 :(得分:1)

我想我会这样做:

UNION

我应该注意到你描述的两种方法并不等同。 FULL OUTER JOIN删除表内和表之间的重复项,因此新表中的行都是不同的。 ship_date - LAG(ship_date) OVER (ORDER BY ship_date)不会从表格中删除重复项。

答案 1 :(得分:1)

我不明白你为什么要使用第三张桌子。

我会选择这样的东西:

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

如果除了不够快,可能使用不存在并添加相关索引。