在2个谓词和2个单独的连接上连接OR的性能比较1个谓词

时间:2015-07-01 21:21:13

标签: sql join db2

在ON子句上使用带有OR的2个谓词的连接对性能有什么影响,如下所示:

 SELECT GS.GuitarType,GD,GuitarColor
 FROM Prod.Guitars GS
 LEFT JOIN Prod.Guitar_Detail GD ON (GS.GuitarID = GD.GuitarID OR GS.GuitarID  = GD.GuitarCatNum)

VS。像这样的东西:

 SELECT GS.GuitarType,GD,GuitarColor
 FROM Prod.Guitars GS
 LEFT JOIN Prod.Guitar_Detail GD ON GS.GuitarID = GD.GuitarID 
 LEFT JOIN Prod.Guitar_Detail GD2 ON GS.GuitarID  = GD.GuitarCatNum

情侣警告:   我们要使用LEFT JOIN不能使用INNER。   我已经运行了两个查询,后者表现得更好。

另外一个问题,第二个不会返回更多行吗?因为它们都被连接在同一个表上,所以它们都应该只保留GS表吗?

在第一个查询中是否必须匹配两次?或者为什么它与第二个不同?

2 个答案:

答案 0 :(得分:3)

让我以相反的顺序回答。

  

另外一个问题,第二个赢得了更多的行吗?   因为他们都在同一张桌子上加入了他们   应该只保留GS表吗?

查询不同(区别在于如何处理空值),并且应该预期不同的执行时间。一切都归结为GD.GuitarID和GD.GuitarCatNum的使用方式。

a)如果设置了GD.GuitarID并且GD.GuitarCatNum为null,则查询将返回相同的数据。
b)如果设置了GD.GuitarID且GD.GuitarCatNum包含与GD.GuitarID相同的值,则第二个查询将返回重复的行。
c)如果GD.GuitarID为null并且设置了GD.GuitarCatNum,则查询将返回相同数量的行,但GD.GuitarColor将返回为null。

现在,假设案例a),执行计划如下所示:

案例1)

SELECT 
  GS.GuitarType,
  GD.GuitarColor 
FROM 
  Guitars GS 
  LEFT JOIN Guitar_Detail GD 
  ON (GS.GuitarID = GD.GuitarID OR 
      GS.GuitarID = GD.GuitarCatNum)

Access Plan:
-----------
    Total Cost:         18.3602
    Query Degree:       1

              Rows 
             RETURN
             (   1)
              Cost 
               I/O 
               |
                3 
             >NLJOIN
             (   2)
             18.3602 
                2 
         /-----+------\
        2               1.5 
     TBSCAN           TBSCAN
     (   3)           (   4)
     8.99536          9.07676 
        1                1 
       |                |
        2                2 
 TABLE: DB2INST1    TABLE: DB2INST1  
     GUITARS       GUITAR_DETAIL
       Q2               Q1

案例2)

SELECT 
  GS.GuitarType,
  GD.GuitarColor 
FROM 
  Guitars GS 
  LEFT JOIN Guitar_Detail GD 
  ON GS.GuitarID = GD.GuitarID 
  LEFT JOIN Guitar_Detail GD2 
  ON GS.GuitarID = GD.GuitarCatNum

    Total Cost:         27.2798
    Query Degree:       1

                               Rows 
                              RETURN
                              (   1)
                               Cost 
                                I/O 
                                |
                                 2 
                              >NLJOIN
                              (   2)
                              27.2798 
                                 3 
                 /--------------+---------------\
                2                                  1 
             HSJOIN<                            NLJOIN
             (   3)                             (   6)
             18.0326                            9.01796 
                2                                  1 
         /-----+------\                     /-----+------\
        2                2                0.5               2 
     TBSCAN           TBSCAN            TBSCAN           TBSCAN
     (   4)           (   5)            (   7)           (   8)
     8.99536          8.99536           0.0226           8.99536 
        1                1                 0                1 
       |                |                 |                |
        2                2                 1                2 
 TABLE: DB2INST1    TABLE: DB2INST1    TABFNC: SYSIBM    TABLE: DB2INST1  
  GUITAR_DETAIL       GUITARS           GENROW        GUITAR_DETAIL
       Q2               Q1                Q4               Q6

希望这有帮助。

答案 1 :(得分:1)

OR通常表现不佳,特别是在连接中。最好设计数据库,这样就不需要这些类型的连接。

但是,我们有时会坚持使用设计,在这种情况下,使用UNION ALL通常会更高效(如果两个连接字段相互激励)。如果字段不是互斥的并且您不想要重复,那么UNION会更慢但更好。