嵌套循环连接与散列连接

散列连接检索首行的成本,通常比嵌套循环连接要高。 使用散列连接时,检索任何行之前数据库服务器都必须建立散列表。 然而,在某些情况下,如果数据库服务器使用散列连接,会缩短总查询时间。

在以下示例中,tab2 具有对 col1 的索引,但 tab1 不具有 对 col1 的索引。运行查询之前执行 SET OPTIMIZATION ALL_ROWS 时,数据库服务器使用散列连接并忽略现有的索引,如以下 SET EXPLAIN 输出部分所示:
QUERY:
------
SELECT * FROM tab1,tab2
WHERE tab1.col1 = tab2.col1
Estimated Cost: 125
Estimated # of Rows Returned: 510
1) lsuto.tab2: SEQUENTIAL SCAN
2) lsuto.tab1: SEQUENTIAL SCAN
DYNAMIC HASH JOIN
        Dynamic Hash Filters: lsuto.tab2.col1 = lsuto.tab1.col1 
但是,运行查询之前执行 SET OPTIMIZATION FIRST_ROWS 时,数据库服务器将使用嵌套循环连接。以下 SET EXPLAIN 部分输出中的子句 (FIRST_ROWS OPTIMIZATION) 显示优化器对查询使用了用户响应时间优化:
QUERY:        (FIRST_ROWS OPTIMIZATION)
------
SELECT * FROM tab1,tab2
WHERE tab1.col1 = tab2.col1
Estimated Cost: 145
Estimated # of Rows Returned: 510
1) lsuto.tab1: SEQUENTIAL SCAN
2) lsuto.tab2: INDEX PATH
        (1) Index Keys: col1
                Lower Index Filter: lsuto.tab2.col1 = lsuto.tab1.col1
NESTED LOOP JOIN