内部結合と外部結合(左結合、右結合)の違いは何ですか?どれが最高のパフォーマンスですか?
ありがとう!
結合のタイプ間のパフォーマンス比較は、結果セットが異なるため、重要ではありません。内部結合の方が高速であっても、左結合の結果(結合の2番目のテーブルと一致しないレコードも含む)が必要な場合は使用しません。
LEFT JOIN B
はB RIGHT JOIN A
と同じです。一部のRDBMSにはRIGHT JOIN
がないため、RIGHT JOIN
ロジックをLEFT JOIN
ロジックに書き換える必要があります
A 1 2 3
B 2 3 4 3
SELECT A.I FROM INNER JOIN B ON B.I = A.I;
output: 2 3, 3
SELECT A.I AS X, B.I AS Y FROM A LEFT JOIN B ON B.I = A.I;
read above code as A on LEFT, JOINs B
output:
X Y
1 NULL
2 2
3 3
3 3
SELECT A.I AS X, B.I AS Y FROM B RIGHT JOIN A ON A.I = B.I;
上記のコードをB on RIGHT, JOINs A
として読み取ります。 Aが左にあるのと同じです
左側にあるものは常に評価され、常に出力されます。左の結合B、Bの右結合Aは次のように想像できます。
var result = new Dictionary<int, int?>();
var A = new int[] { 1, 2, 3 };
var B = new int[] { 2, 3, 4, 3 };
foreach (int aElem in A)
{
bool hasMatch = false;
foreach (int bElem in B)
{
if (bElem == aElem)
{
result.Add(aElem, bElem);
hasMatch = true;
}
}
if (!hasMatch)
result.Add(aElem, null);
}
foreach(int X in result.Keys)
{
MessageBox.Show(string.Format("X {0} Y {1}", X, result[X].HasValue ? result[X].Value.ToString() : "NULL" ));
}
左、右、インナー、アウターはパフォーマンスに影響を与えません。これらはすでにここで十分に説明されています。
ただし、結合に追加してパフォーマンスに影響を与えるヒントがあります。ハッシュ、ループ、マージです。
通常、クエリプランナーがこれらのどれを行うかを決定しますが、場合によっては、それをオーバーライドすることでパフォーマンスを向上させることができます。
A loop
join
は、最初のテーブルの各行について、2番目のテーブルのすべての行を通過します。これは、1つの非常に大きなテーブルと1つの非常に小さなテーブルがある場合に適しています。
A merge
join
は両方のテーブルを順番に処理します。両方のテーブルが、参加しているフィールドによってすでに注文されている場合、それは非常に迅速です。
A hash
join
は、多数の一時テーブルを使用して、結合されたデータをソートするときに出力をグループ化します。
一部の専門DBは、ビットマップ結合などの他のタイプもサポートしています。
うまくいけば、あなたは写真を理解しています。パフォーマンスに関しては、これらは同等です-違いはありません。
編集:おっと。答えのその部分は気にしていなかったと思います。