SQL优化--逻辑优化--外连接、嵌套连接与连接消除

1)外连接消除

①外连接简介

1)LEFT JOIN / LEFT OUTER JOIN:左外连接    

左向外连接的结果集包括:LEFT OUTER子句中指定的左表的所有行,而不仅仅是连接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。       

2)RIGHT JOIN / RIGHT  OUTER  JOIN:右外连接     

右向外连接是左向外联接的反向连接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。       

3)FULL JOIN / FULL OUTER JOIN:全外连接

全外连接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。 

②外连接消除

把外连接变为内连接   A OUTER JOIN B   变形为   A JOIN B

③外连接消除的意义

a)查询优化器在处理外连接操作时所需执行的操作和时间多于内连接。

b)外连接消除后,优化器在选择多表连接顺序时,可以有更多更灵活的选择,从而可以选择更好的表连接顺序,加快查询执行的速度。

c)表的一些连接算法(如块嵌套连接和索引循环连接等)在将规模小的或筛选条件最严格的表作为“外表”(放在连接顺序的最前面,是多层循环体的外循环层),可以减少不必要的I/O开销,能加快算法执行的速度。

④外连接消除的条件

WHERE子句中的条件满足“空值拒绝”(又称为“reject-NULL”条件)。

WHERE条件可以保证从结果中排除外连接右侧(右表)生成的值为NULL的行(即条件确保应用在右表带有空值的列对象上时,条件不满足,条件的结果值为FLASE或UNKONOWEN,这样右表就不会有值为NULL的行生成),所以能使该查询在语义上等效于内连接

explain  SELECT * FROM X LEFT JOIN Y ON (X.X_num=Y.Y_num) 

WHERE Y.Y_num IS NOT NULL;

⑤示例

a)辨析ON和WHERE的差异

ON    t_1_id = t_2_id:t_1_id 和 t_2_id 进行连接

WHERE t_1_id = t_2_id:当t_1_id 和 t_2_id的值相等

⑥外连接消除总结

a)注意外连接与内连接的语义差别

b)外连接优化的条件:空值拒绝

c)外连接优化的本质:语义上是外连接,但WHER条件使得外连接可以蜕化为内连接

2)连接消除

①情况一MySQL不支持

唯一键/主键作为连接条件,三表内连接可以去掉中间表(中间表的列只作为连接条件)。

②情况二MySQL不支持

一些特殊形式,可以消除连接操作(可消除的表除了作为连接对象外,不出现在任何子句中)。

③情况三MySQL不支持

主外键关系的表进行的连接,可消除主键表,这不会影响对外键表的查询。

④总结

a)注意连接消除与外连接消除的技术差别。

b)连接消除去掉的是被连接的某个对象。

c)外连接消除去掉的是外连接的语义,变形为内连接。

3)嵌套连接消除

①概念

连接存在多个层次,用括号标识连接的优先次序。嵌套连接消除,就是消除嵌套的连接层次,把多个层次的连接减少为较少层次的连接,尽量“扁平化”。

②总结

a)嵌套连接消除的连接的层次,这是一种连接的语义顺序的变化。

b)连接消除,消掉的是一些被连接的对象。

c)外连接消除,消掉的是外连接的语义,使得外连接变形为内连接。


摘自《数据库查询优化器的艺术》一书

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。