-- Start
循环嵌套连接(Nested Loop Joins)
首先,看看下面的 SQL 语句。
SELECT e.first_name, e.last_name, e.salary, d.department_name
FROM hr.employees e, hr.departments d
WHERE d.department_name IN ('Marketing', 'Sales')
AND e.department_id = d.department_id;
对于循环嵌套,你可以把表想象成数组,Oracle 会采用如下的方式执行查询。
String[] departments = {};
String[] employees = {};
// 外层循环
for(String dep: departments) {
// 内层循环
for(String emp: employees) {
}
}
很明显,如果 employees 很大且没有索引,外层循环每执行一次都需要全表扫描 employees,这是不可接受的。所以循环嵌套表连接方式适合那些内层循环数据量少且有索引的情形。
当然,你也可以通过下面的方式建议 Oracle 采用循环嵌套连接方式。
-- USE_NL
SELECT /*+ USE_NL(e d) */ e.first_name, e.last_name, e.salary, d.department_name
FROM hr.employees e, hr.departments d
WHERE d.department_name IN ('Marketing', 'Sales