2017-03-21 18 views
1

私はそれぞれ120,000,000レコードを含む2つのSQLテーブルを扱っています。ほとんどのレコード(約60,000)は2つのテーブルに重複しています。両方のテーブルの構造は同じです。UNIONとFULL OUTER JOINの実行の詳細

各テーブルには40個の列があります。私はテーブルの一つにレコードを結合する必要があります。

私はそれを行う2つの方法を知っています(どちらも私に望ましい出力を与えます)。私はどちらの方法が良いか知りたいと思いますし、より良い方法がありますか?

方法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:UNION

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 

使用がより良い選択であるように見えるが、に大規模なデータセットを選択する必要が周りのスペースの問題に対処するために、誰もができるようです新しいテーブルとそれを落とす。 120,000,000レコードは単なる一例に過ぎません。より多くのレコードを持つ他のテーブルがあります。

+0

[ユニオンまたはAの結合を使用する - より速いもの]の可能な複製(http://stackoverflow.com/questions/2309936/use-a-union-or-a-join-what-is-faster) – SaggingRufus

+1

おそらく、UNION ALLよりもUNION ALLが高速です。 – jarlh

+0

「LEFT JOIN」が必要なときに「FULL OUTER JOIN」を使用する理由がわかりません。また、Col1とCol2の両方がNULLかどうかを確認する必要はありません。 NULL値がNULLに等しくないため、Col1がNULLの場合、Table1はTable2と等しくない可能性があります。 'WHERE Table1.Col1 IS NULL'を使用してください –

答えて

1

なぜ3番目のテーブルを使用するのか分かりません。

私はこのようなものとなるだろう。おそらく存在しない使用と関連するインデックスを追加し、十分に速くない場合を除き、

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 
        ); 

私はあなたが記述2つの方法は等価ではないことに注意してください。 UNIONは、テーブル内およびテーブル間の重複を削除するので、新しいテーブル内の行はすべて別個です。 FULL OUTER JOINは、テーブル内の重複を削除しません。

+0

'FULL OUTER JOINはテーブル内の重複を削除しません。' - 良い点Gordon。私は各テーブル内に重複はありません。 – hmmm