有朋友在阅读了《数据库查询优化器的艺术:原理解析与SQL性能的艺术》一书后提出”在逻辑查询中,关于相关子查询的处理,不管是理论原理还是pgsql源码中,发现都没有明确说明”,这是一个很好的问题, 读者读得特别认真并在思考.本篇即分析一下相关和非相关子查询的优化技术.
一 子查询的优化
子查询的优化的基本知识,建议参看《数据库查询优化器的艺术:原理解析与SQL性能的艺术》第二章2.2.1节子查询的优化,第18页--28页.系统地讲述了:
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)的属性 */
三 特别要强调的----做子查询优化的原因
为什么要作子查询优化呢?
在数据库实现早期,查询优化器对子查询一般采用嵌套执行的方式,即对父查询中的每一行,都执行一次子查询,这样子查询会执行很多次。这种执行方式效率很低。
而对子查询进行优化,可能带来几个数量级的查询效率的提高。子查询转变成为连接操作之后,会得到如下好处:
子查询不用执行很多次。
优化器可以根据统计信息来选择不同的连接方法和不同的连接顺序。
子查询中的连接条件、过滤条件分别变成了父查询的连接条件、过滤条件,优化器可以对这些条件进行下推,以提高执行效率。
[待续......]
本文深入探讨了数据库查询优化器中子查询的优化技术,详细解释了相关子查询和非相关子查询的区别及其优化方法,并提供了具体的优化案例。
1852

被折叠的 条评论
为什么被折叠?



