Различия в SQL-соединениях - PullRequest
       18

Различия в SQL-соединениях

41 голосов
/ 07 января 2009

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

Спасибо!

Ответы [ 5 ]

77 голосов
/ 07 января 2009

Проверьте эту статью:

Визуальное объяснение соединений SQL

Внутреннее присоединение:

image

Внешнее соединение слева:

image

правое внешнее соединение:

image

4 голосов
/ 07 января 2009

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

3 голосов
/ 07 января 2009

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

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

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

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

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

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

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

3 голосов
/ 07 января 2009

A LEFT JOIN B совпадает с B RIGHT JOIN A. Некоторые РСУБД не имеют RIGHT JOIN, поэтому вы должны переписать вашу RIGHT JOIN логику в LEFT JOIN logic

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. Что точно так же, как А на левом

Что бы ни было слева, всегда оценивается, всегда есть вывод. Вы можете представить себе левое соединение 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"  ));
        }
0 голосов
/ 07 января 2009

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

РЕДАКТИРОВАТЬ: Ой. Думаю, вам не важна эта часть ответа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...