SQL Server Plans : difference between Index Scan / Index Seek

95,296

Solution 1

An index scan is where SQL server reads the whole of the index looking for matches - the time this takes is proportional to the size of the index.

An index seek is where SQL server uses the b-tree structure of the index to seek directly to matching records (see http://mattfleming.com/node/192 for an idea on how this works) - time taken is only proportional to the number of matching records.

  • In general an index seek is preferable to an index scan (when the number of matching records is proprtionally much lower than the total number of records), as the time taken to perform an index seek is constant regardless of the toal number of records in your table.
  • Note however that in certain situations an index scan can be faster than an index seek (sometimes significantly faster) - usually when the table is very small, or when a large percentage of the records match the predicate.

Solution 2

The basic rule to follow is Scans are bad, Seeks are good.

Index Scan

When SQL Server does a scan it loads the object which it wants to read from disk into memory, then reads through that object from top to bottom looking for the records that it needs.

Index Seek

When SQL Server does a seek it knows where in the index that the data is going to be, so it loads up the index from disk, goes directly to the part of the index that it needs and reads to where the data that it needs ends. This is obviously a much more efficient operation than a scan, as SQL already knows where the data it is looking for is located.


How can I modify an Execution Plan to use a Seek instead of a Scan?

When SQL Server is looking for your data probably one of the largest things which will make SQL Server switch from a seek to a scan is when some of the columns are you looking for are not included in the index you want it to use. Most often this will have SQL Server fall back to doing a clustered index scan, since the Clustered index contains all the columns in the table. This is one of the biggest reasons (in my opinion at least) that we now have the ability to INCLUDE columns in an index, without adding those columns to the indexed columns of the index. By including the additional columns in the index we increase the size of the index, but we allow SQL Server to read the index, without having togo back to the clustered index, or to the table it self to get these values.

References

For information regarding the specifics of each of these operators within a SQL Server Execution plan see....

Solution 3

Short answer:

  • Index scan: Touch all rows but certain columns.

  • Index seek: Touch certain rows and certain columns.

Solution 4

With an Index Scan, all rows in the index are being scanned to find a matching row. This can be efficient for small tables. With an Index Seek, it only needs to touch the rows that actually meet the criteria and so is generally more performant

Solution 5

An Index Scan happens when the index definition cannot find on a single row to satisfy search predicates. In this case SQL Server has to scan multiple pages to find a range of rows which satisfy the search predicates.

In the case of a Index Seek, SQL Server finds a single row matching search predicates using index definition.

Index Seeks are better and more effective.

Share:
95,296
cindi
Author by

cindi

Updated on December 06, 2020

Comments

  • cindi
    cindi over 3 years

    In a SQL Server Execution plan what is the difference between an Index Scan and an Index Seek

    I'm on SQL Server 2005.

  • Justin
    Justin almost 13 years
    Seeks are not always better, for example if the table is relatively small and a large percentage of the rows in that table need to be returned then an index scan can end up being much more efficient.
  • Jose Areas
    Jose Areas about 9 years
    Hi Justin , I guess you wanna say table scans some times can be better. Indexes Seek are always better than a Index Scan unless we are talking about clustered. But, sometimes, a table scan or a Clustered Index Scan may be more efficient for the reason you mentioned. Instead of seek the index and get the fields are not in the index from the table, sometimes, ms sql will use the table even if the index has the criteria field.
  • Ronak Agrawal
    Ronak Agrawal almost 7 years
    Is the link still active? for me it does not work. Please help if there is an updated link
  • Justin
    Justin almost 7 years
    @RonakAgrawal Looks like the link is in fact dead - maybe check wikipedia instead?
  • rebornx
    rebornx over 6 years
  • Vishe
    Vishe about 2 years
    how to convert index scan to index seek.