SQL Join Differences

Какая разница между внутренним соединением и внешним соединением (левое соединение, правое соединение) и которое имеет лучшую производительность?

Спасибо!

Ответы

Ответ 2

Сравнение производительности между типами соединений не имеет значения, поскольку они дают разные наборы результатов. Даже если внутреннее соединение выполняется быстрее, вы не будете использовать его, если вам нужны результаты левого соединения (включая даже записи, которые не соответствуют второй таблице в соединении).

Ответ 3

A LEFT JOIN B совпадает с B RIGHT JOIN A. В некоторых РСУБД нет 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

Все, что слева, всегда оценивается, всегда имеет выход. Вы можете представить ЛЕВАЯ ВСТУПЛЕНИЕ В, В ПРАВОЕ СОЕДИНЕНИЕ А, как:

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

Ответ 4

Левая, правая, внутренняя и внешняя не влияют на производительность, и они уже хорошо объяснены здесь.

Однако есть подсказки, которые вы можете добавить к объединениям, которые влияют на производительность: хэш, цикл и слияние.

Обычно планировщик запросов решает, что из этого делать, но иногда вы можете повысить производительность, переопределив его.

A loop join проходит через каждую строку во второй таблице для каждой строки в первой. Это хорошо, если у вас есть одна очень большая таблица и одна намного меньше.

A merge join проходит по обеим таблицам в порядке. Это может быть очень быстро, если обе таблицы уже упорядочены по полю, к которому вы присоединяетесь.

A hash join использует множество временных таблиц для группировки вывода по мере сортировки по объединенным данным.

Некоторые специализированные БД также поддерживают другие типы, такие как объединения битмапов.

Ответ 5

Надеюсь, вы понимаете фотографии. По производительности, они эквивалентны - никакой разницы.

EDIT: Ой. Думаю, вас не волновала эта часть ответа.