Adaptive Server can use one of several methods to flatten subqueries into joins.
These methods are described in “Flattening in, any, and exists subqueries” on page 145.
When subqueries are flattened into existence joins, the output looks like normal showplan output for a join, with the possible exception of the message “EXISTS TABLE: nested iteration.”
This message indicates that instead of the normal join processing, which looks for every row in the table that matches the join column, Adaptive Server uses an existence join and returns TRUE as soon as the first qualifying row is located.
For more information on subquery flattening, see “Flattened subqueries executed as existence joins” on page 148.
Adaptive Server flattens the following subquery into an existence join:
select title from titles where title_id in (select title_id from titleauthor) and title like "A Tutorial%"
QUERY PLAN FOR STATEMENT 1 (at line 1). STEP 1 The type of query is SELECT. FROM TABLE titles Nested iteration. Index : title_ix Forward scan. Positioning by key. Keys are: title ASC Using I/O Size 16 Kbytes for index leaf pages. With LRU Buffer Replacement Strategy for index leaf pages. Using I/O Size 2 Kbytes for data pages. With LRU Buffer Replacement Strategy for data pages. FROM TABLE titleauthor EXISTS TABLE : nested iteration. Index : ta_ix Forward scan. Positioning by key. Index contains all needed columns. Base table will not be read. Keys are: title_id ASC Using I/O Size 2 Kbytes for index leaf pages. With LRU Buffer Replacement Strategy for index leaf pages.
If there is not a unique index on publishers.pub_id, this query is flattened by selecting the rows from publishers into a worktable and then creating a unique clustered index. This process is called unique reformatting:
select title_id from titles where pub_id in (select pub_id from publishers where state = "TX")
QUERY PLAN FOR STATEMENT 1 (at line 1). STEP 1 The type of query is INSERT. The update mode is direct. Worktable1 created for REFORMATTING. FROM TABLE publishers Nested iteration. Table Scan. Forward scan. Positioning at start of table. Using I/O Size 2 Kbytes for data pages. With LRU Buffer Replacement Strategy for data pages. TO TABLE Worktable1. STEP 2 The type of query is SELECT. FROM TABLE Worktable1. Nested iteration. Using Clustered Index. Forward scan. Positioning at start of table. Using I/O Size 2 Kbytes for data pages. With LRU Buffer Replacement Strategy for data pages. FROM TABLE titles Nested iteration. Table Scan. Forward scan. Positioning at start of table. Using I/O Size 2 Kbytes for data pages. With LRU Buffer Replacement Strategy for data pages.
For more information, see “Flattened subqueries executed using unique reformatting”.
This query performs a regular join, selecting all of the rows into a worktable. In the second step, the worktable is sorted to remove duplicates. This process is called duplicate elimination:
select title_id, au_id, au_ord from titleauthor ta where title_id in (select ta.title_id from titles t, salesdetail sd where t.title_id = sd.title_id and ta.title_id = t.title_id and type = ’travel’ and qty > 10)
QUERY PLAN FOR STATEMENT 1 (at line 1). STEP 1 The type of query is INSERT. The update mode is direct. Worktable1 created for DISTINCT. FROM TABLE salesdetail sd Nested iteration. Table Scan. Forward scan. Positioning at start of table. Using I/O Size 16 Kbytes for data pages. With LRU Buffer Replacement Strategy for data pages. FROM TABLE titles t Nested iteration. Using Clustered Index. Index : title_id_ix Forward scan. Positioning by key. Keys are: title_id ASC Using I/O Size 2 Kbytes for data pages. With LRU Buffer Replacement Strategy for data pages. FROM TABLE titleauthor ta Nested iteration. Index : ta_ix Forward scan. Positioning by key. Keys are: title_id ASC Using I/O Size 2 Kbytes for index leaf pages. With LRU Buffer Replacement Strategy for index leaf pages. Using I/O Size 2 Kbytes for data pages. With LRU Buffer Replacement Strategy for data pages. TO TABLE Worktable1. STEP 2 The type of query is SELECT. This step involves sorting. FROM TABLE Worktable1. Using GETSORTED Table Scan. Forward scan. Positioning at start of table. Using I/O Size 16 Kbytes for data pages. With MRU Buffer Replacement Strategy for data pages.