Introduction
Contusing the
series of my Article related to Understanding of Execution Plan, here we are
trying to look some more operations. Hope u can understand it and like it. We
need more comments from our readers that all of us can share knowledge and understand
the complexity of Execution plan well.
Table Scan
Table Scan occurs
with Heap Table only, the table that does not have any clustered index. With clustered
Index we can get the Clustered Index Scan which is more or less same as Table scan.
SELECT *
FROM
tbl_EMPLOYEERECORD;
The Table
Scan occurs for several reasons and the most common is if there is no useful
index is there and to retrieve the desired records the query optimizer must
search every row. Another common reason is that if we want to retrieve all
records from table.
Please
remember that, If the table have small number of records then the table scan is
not a problem.
RID Lookup
RID Lookup is the heap equivalent of the Key
Lookup operation.
As was mentioned in our previous article,
non-clustered indexes don't always have all the data needed to satisfy a query.
When they do not, an additional operation is required to get that data. When
there is a clustered index on the table, it uses a Key Lookup operator. When
there is no clustered index, the table is a heap and must look up data using an
internal identifier known as the Row ID or RID.
If we
specifically filter the results of our previous Database Log query using the
primary key column, we see a different plan that uses a combination of an Index
Seek and a RID Lookup.
CREATE NONCLUSTERED
INDEX IX_NONC_EMPNAME
ON tbl_EMPLOYEERECORD(EMPNAME);
GO
SELECT *
FROM
tbl_EMPLOYEERECORD WITH(INDEX(IX_NONC_EMPNAME))
WHERE
EMPNAME =
'Joydeep Das';
GO
To return the results for this query, the query optimizer
first performs an Index Seek on non clustered index columns on WHERE clauses.
While this index is useful in identifying the rows that meet the WHERE clause
criteria, all the required data columns are not present in the index.
If we look at the Tool Tip for the Index Seek,
we see the value Bmk1000 in the Output List. This Bmk1000 is an additional
column, not referenced in the query. It's the key value from the non-clustered
index and it will be used in the Nested Loops operator to join with data from
the RID Lookup operation.
Next, the query optimizer performs a RID Lookup, which is
a type of Bookmark Lookup that occurs on a heap table (a table that doesn't
have a clustered index), and uses a row identifier to find the rows to return.
In other words, since the table doesn't have a clustered index (that includes
all the rows), it must use a row identifier that links the index to the heap.
This adds additional disk I/O because two different operations have to be
performed instead of a single operation, which are then combined with a Nested
Loops operation.
Related Reference
Understanding of Execution Plan
– III - B [ The OPERATORS ]
Understanding of
Execution Plan – II [Reuse of the Execution Plan]
Summary
In our next level we
are going to discuss about more operator one by one. Hope you like it and need
your valuable comments related to it.
Posted by: MR. JOYDEEP DAS
No comments:
Post a Comment