在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表吗?
在第一个查询中是否必须匹配两次?或者为什么它与第二个不同?
答案 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会更慢但更好。