【问题标题】:SQL Join DifferencesSQL 连接差异
【发布时间】:2010-09-29 23:33:40
【问题描述】:

内连接和外连接(左连接、右连接)有什么区别,哪一个性能最好?

谢谢!

【问题讨论】:

    标签: sql join


    【解决方案1】:

    查看这篇文章:

    A Visual Explanation of SQL Joins

    内连接:

    左外连接:

    右外连接:

    【讨论】:

    • 问题的第 2 部分是关于性能的,它不一定与 join 方法直接相关,您对此有何进一步评论?
    • 请务必阅读文章中的所有 cmets,因为它将连接表示为集合操作是非常受批评的!例如,左连接不是交集,因为它会创建新的元组。
    • 该图如果还显示 FULL OUTER JOIN 会更好。由于不同类型的连接会产生不同的结果,因此关于性能的问题有些无关紧要。您应该选择能产生所需结果的那个。性能取决于 DBMS 的内部。
    • 一个完整的外连接就是两个圆圈的全部,所以真的需要用图表吗?
    【解决方案2】:

    希望你能理解这些图片。在性能方面,它们是等效的 - 没有区别。

    编辑:哎呀。猜猜你不关心答案的那部分。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        连接类型之间的性能比较是无关紧要的,因为它们给出了不同的结果集。即使内部联接更快,如果您需要左联接的结果(甚至包括与联接中的第二个表不匹配的记录),您也不会使用它。

        【讨论】:

          【解决方案5】:

          左、右、内、外不影响性能,这里已经很好地解释了。

          但是,您可以将一些提示添加到影响性能的连接中:散列、循环和合并。

          通常查询规划器会决定执行哪些操作,但有时您可以通过覆盖它来提高性能。

          loop join 遍历第二个表中的每一行,对应第一个表中的每一行。如果您有一张非常大的桌子和一张小得多的桌子,这很好。

          merge join 按顺序一起遍历两个表。如果两个表都已按您要加入的字段排序,则速度会非常快。

          hashjoin 在对连接数据进行排序时使用大量临时表对输出进行分组。

          一些专业数据库还支持其他类型,例如位图连接。

          【讨论】:

            猜你喜欢
            • 2010-10-03
            • 2014-05-20
            • 2019-08-06
            • 2015-05-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-08-29
            相关资源
            最近更新 更多