Nested-loop joins versus hash joins
Hash joins generally have a higher cost to retrieve the first row than nested-loop joins do. The database server must build the hash table before it retrieves any rows. However, in some cases, total query time is faster if the database server uses a hash join.
In the following example, tab2 has an index on col1,
but tab1 does not have an index on col1. When you execute
SET OPTIMIZATION ALL_ROWS before you run the query, the database server
uses a hash join and ignores the existing index, as the following
portion of SET EXPLAIN output shows:
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
However, when you execute SET OPTIMIZATION FIRST_ROWS before you
run the query, the database server uses a nested-loop join. The clause
(FIRST_ROWS OPTIMIZATION) in the following partial SET EXPLAIN output
shows that the optimizer used user-response-time optimization for
the query:
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