今天我遇到一个面试题: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。
所以优化的时候应该是数据量大的表放在前面。
以上是我在不懂装懂的拙论。欢迎大家批评.......