1 子查询在查询语句中可出现的位置
2 子查询的分类
3 子查询的优化的思路
    3.1 做子查询优化的原因
    3.2 子查询优化技术
    3.3 子查询展开
4 最常见的子查询类型的优化
    4.1 IN类型
    4.2 ALL/ANY/SOME类型
    4.3 EXISTS类型
5 实例

二 相关子查询和非相关子查询

这是子查询优化的基础,首先要区分这2个概念.


相关子查询。子查询的执行依赖于外层父查询的一些属性值。子查询因依赖于父查询的参数,当父查询的参数改变时,子查询需要根据新参数值重新执行(查询优化器对相关子查询进行优化有一定意义),如:

SELECT * FROM t1 WHERE col_1 = ANY

(SELECT col_1 FROM t2 WHERE t2.col_2 = t1.col_2);/* 子查询语句中存在父查询的t1表的col_2列 */

非相关子查询。子查询的执行,不依赖于外层父查询的任何属性值。这样子查询具有独立性,可独自求解,形成一个子查询计划先于外层的查询求解,如:

SELECT * FROM t1 WHERE col_1 = ANY

(SELECT col_1 FROM t2 WHERE t2.col_2 = 10);/* 子查询语句中(t2)不存在父查询(t1)的属性 */


三 特别要强调的----做子查询优化的原因

为什么要作子查询优化呢?

在数据库实现早期,查询优化器对子查询一般采用嵌套执行的方式,即对父查询中的每一行,都执行一次子查询,这样子查询会执行很多次。这种执行方式效率很低。

而对子查询进行优化,可能带来几个数量级的查询效率的提高。子查询转变成为连接操作之后,会得到如下好处:


子查询不用执行很多次。


优化器可以根据统计信息来选择不同的连接方法和不同的连接顺序。


子查询中的连接条件、过滤条件分别变成了父查询的连接条件、过滤条件,优化器可以对这些条件进行下推,以提高执行效率。