关联组合操作 NESTED LOOPS操作
关联组合操作
我将拥有多个子操作且其中一个子操作控制所有其他子操作的执行的所有操作称为关联组合操作。下列操作均属于这种类型: NESTED LOOPS、FILTER、UPDATE、CONNECT BY WITH FILTERING、UNION ALL (RECURSIVE WITH)以及BITMAP KEY ITERATION。 控制关联组合操作运行的规则除了之前10.3.1节中描述的规则之外,还包括以下规则。
Ø 拥有最小ID的子操作控制其他子操作的执行。
Ø 子操作从拥有最小ID的操作开始执行直到拥有最大ID的操作。但是,与无关联组合操作相反,它们不是顺序执行的,而是按某种交错的方式执行。
Ø 只有第一个子操作至多执行一次。其他所有子操作可能会执行多次或根本不执行。
即使这种类型的操作共享相同的特性,而它们当中的每一个,在某些方面,都有自己的行为。我们来看一下它们中各自的样例。注意接下来的部分提供的所有例子都是related-combine.sql脚本生成输出的摘录。
NESTED LOOPS操作
这个操作用于联接两组数据。因此,它总是有两个子操作,不能多也不能少。拥有最小ID的子操作被称为外循环或驱动行源。第二个操作被称为内循环。这个操作的特性是,外循环每返回一条数据,内循环都要执行一次。
下面的查询及其执行计划就是这样的例子(图10-5展示了它的父-子关系的图形表示):
select * FROM emp, dept
WHERE emp.deptno = dept.deptno
AND emp.comm IS NULL
AND dept.dname !='SALES';
在此执行计划中,NESTED LOOPS操作的两个子操作都是独立操作。通过应用之前描述的规则,你会发现执行计划按以下顺序执行各个操作。