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)外连接消除,消掉的是外连接的语义,使得外连接变形为内连接。
摘自《数据库查询优化器的艺术》一书
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。