连表查询时,from后子句的执行顺序和优化
2010-07-02 19:08
190 查看
今天我遇到一个面试题:from后面的子句,它的执行顺序是从左向右还是从右向左?如何进行优化?
我猛然的愣住了,因为我毕竟不是专搞数据库的,我只能凭感觉说出了从右向左。至于为什么,我也说不出来个所以然。
后来和专搞数据库的同事商量了一下,大概做出了如下结论:
比如一个sql查询语句:
select * from A , B ,C where A.***=B.*** and B.###=C.###
那么oralce在执行的时候,from后的A,B,C到底是一个怎么样的执行顺序呢?
这一查询的连接顺序是A->B->C。
事实上,Oracle首先将C散列进入内存,然后将A散列进入内存,然后开始读B。对于B的每一行,Oracle探查A散列寻找匹配,因此第一个连接是A->B;如果第一个探查是成功的,那么Oracle探查C散列寻找匹配,因此第二个连接是B->C—— 虽然从技术上讲我们应该说第二个连接是(A->B)->C。
所以优化的时候应该是数据量大的表放在前面。
以上是我在不懂装懂的拙论。欢迎大家批评.......
我猛然的愣住了,因为我毕竟不是专搞数据库的,我只能凭感觉说出了从右向左。至于为什么,我也说不出来个所以然。
后来和专搞数据库的同事商量了一下,大概做出了如下结论:
比如一个sql查询语句:
select * from A , B ,C where A.***=B.*** and B.###=C.###
那么oralce在执行的时候,from后的A,B,C到底是一个怎么样的执行顺序呢?
这一查询的连接顺序是A->B->C。
事实上,Oracle首先将C散列进入内存,然后将A散列进入内存,然后开始读B。对于B的每一行,Oracle探查A散列寻找匹配,因此第一个连接是A->B;如果第一个探查是成功的,那么Oracle探查C散列寻找匹配,因此第二个连接是B->C—— 虽然从技术上讲我们应该说第二个连接是(A->B)->C。
所以优化的时候应该是数据量大的表放在前面。
以上是我在不懂装懂的拙论。欢迎大家批评.......
相关文章推荐
- 浅谈SQL优化入门:1、SQL查询语句的执行顺序
- oracle优化器与sql查询执行顺序
- 含有GROUP BY子句的查询中如何显示COUNT()为0的结果( SELECT语句完整的执行顺序)
- 查询语句中select from where group by having order by的执行顺序
- 查询语句中select from where group by having order by的执行顺序
- 查询语句中select from where group by having order by的执行顺序
- 查询语句中select from where group by having order by的执行顺序
- sql查询原理和Select执行顺序(sql优化)
- 查询语句中select from where group by having order by的执行顺序
- 查询语句中select from where group by having order by的执行顺序
- 关于数据库优化2——关于表的连接顺序,和where子句的前后顺序,是否会影响到sql的执行效率问题
- 当WHERE子句、GROUP BY子句和HAVING子句同时出现在一个查询中时,SQL的执行顺序
- 查询语句中select from where group by having order by的执行顺序
- 查询语句中select from where group by having order by的执行顺序
- 查询语句中select from where group by having order by的执行顺序
- SQL优化——SQL子句执行顺序和Join的一点总结
- SQL SERVER 优化思路之 SQL查询语句的执行顺序
- 查询语句中select from where group by having order by的执行顺序
- SQL语句执行顺序以及oracle基本查询优化
- SQL查询语句中select from where group by having order by的执行顺序