SQL优化--逻辑优化--外连接、嵌套连接与连接消除
来源:互联网 发布:哔哩哔哩客户端mac 编辑:程序博客网 时间:2024/05/29 11:33
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)外连接消除,消掉的是外连接的语义,使得外连接变形为内连接。
摘自《数据库查询优化器的艺术》一书
- SQL优化--逻辑优化--外连接、嵌套连接与连接消除
- 外连接消除、嵌套连接消除与连接消除
- MySQL查询优化器--逻辑查询优化技术(三)--嵌套连接消除
- MySQL查询优化器--逻辑查询优化技术(五)--外连接的消除(一)
- MySQL查询优化器--逻辑查询优化技术(五)--外连接的消除(二)
- MySQL查询优化器--逻辑查询优化技术(四)--连接的消除
- 【mysql 优化 4】嵌套连接优化
- SQL优化--物理优化--表扫描与连接算法
- 【mysql优化 3】嵌套循环连接算法
- sql连接的优化问题
- sql 连接接查询优化
- SQL表连接优化总结
- oracle sql优化之多表连接优化
- mysql5.7官网直译SQL语句优化--嵌套连接的优化
- SQL优化经典案例----外连接where条件位置优化
- SQL优化经典案例----外连接where条件位置优化
- 连接策略与搜索引擎优化
- SQL中的连接查询与嵌套查询
- Spring WebSocket教程(二)
- 使用TraceView调试并提高Android应用性能
- 文本分类小结
- Poj 1276 Cash Machine 多重背包
- [Python]循环中的else,break和continue详解
- SQL优化--逻辑优化--外连接、嵌套连接与连接消除
- sql根据表关键字查询表名
- POJ—2828—Buy_Tickets—【数据结构】【线段树】【单点更新】
- yii2之单文件与多文件上传
- 【django】表单Form类2-自定义校验规则
- JAVA并发编程学习笔记之Unsafe类
- HTTP 1.1与HTTP 1.0的比较及状态码详解
- Springside中使用MyBatis进行分页
- 给创业者的30条建议