An OR
list
has as many as N rows; one for each distinct OR
or IN
value
specified in the query.The first message shows that an OR
scan
is reading rows from an in-memory table that contains values from
an IN
list or multiple or clauses
on the same column. The OR
list
appears only in query plans that use the special or strategy for in lists.
The second message shows the maximum number of rows (N)
that the in-memory table can have. Since OR
list
eliminates duplicate values when filling the in-memory table, N may
be less than the number of values appearing in the SQL statement.
As an example, the following query generates a query plan with the
special or strategy and an OR
list:
select s.id from sysobjects s where s.id in (1, 0, 1, 2, 3) go QUERY PLAN FOR STATEMENT 1 (at line 1). STEP 1 The type of query is SELECT. 4 operator(s) under root ROOT:EMIT Operator (VA = 4) |NESTED LOOP JOIN Operator (VA = 3) (Join Type: Inner Join) | | |SCAN Operator (VA = 2) | | FROM OR List | | OR List has up to 5 rows of OR/IN values. | | |RESTRICT Operator (VA = 2)(0)(0)(0)(8)(0) | | |SCAN Operator (VA = 1) | | | FROM TABLE | | | sysobjects | | | s | | | Using Clustered Index. | | | Index : csysobjects | | | Forward Scan. | | | Positioning by key. | | | Index contains all needed columns. Base table will not be read. | | | Keys are: | | | id ASC | | | Using I/O Size 2 Kbytes for index leaf pages. | | | With LRU Buffer Replacement Strategy for index leaf pages.
This example has five values in the IN
list,
but only four are distinct, so the OR
list
puts only the four distinct values in its in-memory table. In the
example query plan, the OR
list
is the left-child operator of the NESTED LOOP
JOIN
operator and a SCAN
operator
is the right child of the NESTED LOOP JOIN
operator. When
this plan executes, the NESTED LOOP JOIN
operator
calls the or command to return a row from its
in-memory table, then the NESTED LOOP JOIN
operator
calls on the SCAN
operator
to find all matching rows (one at a time), using the clustered index
for lookup. This example query plan is much more efficient than
reading all of the rows of sysobjects and comparing
the value of sysobjects.id in each row to the
five values in the IN
list.