sql进阶
一、嵌套循环(NESTED LOOPS)
***算法:驱动表返回一行数据,通过连接列传值给被驱动表,驱动表返回多少行,被驱动表就要被扫描多少次***
- 被驱动表必须走索引。如果被驱动表的连接列没在索引中,那么被驱动表只能走全表扫描,而且是反复多次全表扫描。当被驱动表很大的时候,sql就执行不出结果
- 被驱动表走索引只能走index unique scan或者index range scan,不能走table access full,不能走index full scan,不能走index skip scan,也不能走index fast full scan
- 两表返回少量数据才能走嵌套循环。如果两表关联返回100万条数据,那么被驱动表走索引就会返回一百万次回表。回表一般是单块读,这个时候sql性能极差
- 当两表为外关联的时候,如果执行计划是嵌套循环连接,驱动表只能是主表,使用hint也不行
select /*+ use_nl(e,d) leading(d) */ *
from emp e