0

テーブル B からテーブル A に行をコピーする必要があります。要件は、まだ A にない行のみを挿入することです。

私の質問は、次の2つのうちどちらがより効率的かということです。

A)

   INSERT INTO A (x, y, z)
   SELECT x, y, z
   FROM B b
   WHERE b.id NOT IN (SELECT id FROM A);

B)

   INSERT INTO A (x, y, z)
   SELECT b.x, b.y, b.z
   FROM B b LEFT OUTER JOIN A a
     ON b.id = a.id
   WHERE a.id is NULL;

答えはテーブルのサイズに依存すると思います。しかし、あるアプローチを他のアプローチよりも使用することについて、明白な何かがあるかどうかを知りたかった.

あいまいさを軽減するために、テーブル B の行数が 50K 未満で、テーブル A のサイズが常にテーブル B の 1 ~ 5 倍以上であるとします。

誰かがこれを行うためのより効率的な方法を持っている場合は、教えてください。

4

4 に答える 4

4

別のオプションを追加するには:

INSERT INTO A (x, y, z)
SELECT B.x, B.y, B.z
FROM B
WHERE NOT EXISTS(SELECT * FROM A WHERE A.id = B.id)

私は通常、LEFT JOIN アプローチを使用します。ただし、何が最も効率的かを本当に知りたい場合は、環境でいくつかのテストを実行してください。各アプローチの実行計画を確認してください (複数のアプローチが実際には同じ実行計画になる場合があります)。

于 2009-12-03T22:22:38.540 に答える
0

それは問題ではありません。優れたオプティマイザはこれらを同じように扱います。実際には、まさにこのケースで風変わりな実行計画を見てきましたが、ムード、読みやすさ、およびクエリの複雑さに応じて、両方のスタイルを交互に使用することが知られています。

SQL Server では、ある種の連結の回避策 (私はお勧めしません) を使用せずに 1 つの列を超えるタプルで JOIN する必要がある場合、オプション A は使用できません。また、特に結合を使用すると、実際には squirrely になります)、これはタプルに直接拡張されます。

INSERT INTO A (x, y, z) 
SELECT x, y, z 
FROM B b 
WHERE NOT EXISTS (SELECT * FROM A WHERE id = b.id); 

INSERT INTO A (x, y, z) 
SELECT x, y, z 
FROM B b 
WHERE NOT EXISTS (SELECT * FROM A WHERE id1 = b.id1 AND id2 = b.id2); 
于 2009-12-03T22:24:30.440 に答える
0

オプション B の方が優れていると思います。特に、テーブル A がテーブル B よりも 1 倍大きい場合はなおさらです。

a.id と b.id にインデックスがある場合、各行に where を使用するよりも結合が高速になります...

于 2009-12-03T22:26:28.720 に答える
0

行数とデータベースのアクティビティに応じて、挿入の前にテーブルのすべてのインデックスを削除し、後で再作成すると非常に役立ちます。

于 2009-12-03T22:52:57.107 に答える