在嵌套循环连接中,数据库服务器扫描第一个表(或外表),然后将通过表过滤器的每一行与第二个表(或内表)中所找到的行连接起来。
SELECT * FROM customer, orders WHERE customer.customer_num=orders.customer_num AND order_date>"01/01/2007";
数据库服务器通过索引或通过表扫描访问外表。数据库服务器首先应用各种表过滤器。为了得到满足外表上的过滤器的每一行,数据库服务器将读取内表以查找匹配项。
为了得到外表中满足表过滤器的每一行,数据库服务器将读取一次内表。由于内表可能会被读取很多次,数据库服务器常常通过索引访问内表。
图: 嵌套循环连接
如果内表没有索引,那么数据库服务器可能会在查询执行时构造一个自动索引。优化器可能确定:在查询执行时构造一个自动索引的成本要比扫描内表来查找外表中的每一符合条件的行的成本低。
如果优化器将某个子查询更改为嵌套循环连接,那么它可能使用嵌套循环连接的另一种变形形式,称为半连接。 在半连接中,数据库服务器只读取内表一直到它找到匹配项为止。换句话说,对于外表中的每一行,内表最多提供一行。有关优化器如何处理子查询的更多信息,请参阅子查询的查询计划。