内连接和外连接(左连接,右连接)有什么区别,它们的性能最好?
谢谢!
连接类型之间的性能比较是无关紧要的,因为它们给出了不同的结果集。即使内部联接更快,如果您需要左联接的结果(甚至包括与联接中的第二个表不匹配的记录),您也不会使用它。
ALEFT 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 在 LEFT 相同
左边的东西总是被评估,总是有输出。您可以将 A LEFT JOIN B, B RIGHT JOIN 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
A按顺序一起遍历两个表。如果两个表都已按您要加入的字段排序,则速度会非常快。merge
join
A在对连接数据进行排序时,使用大量临时表对输出进行分组。hash
join
一些专业数据库还支持其他类型,例如位图连接。
希望你能看懂图片。在性能方面,它们是等效的 - 没有区别。
编辑:哎呀。猜猜你不关心答案的那一部分。