|  | Posted by Erland Sommarskog on 06/17/05 01:03 
(talfano@ncpsolutions.com) writes:> I don't understand why the column list in the select would make a
 > difference on which index is used.  It seems like the where clause
 > would be the determining factor.  At any rate, I tried your suggestion
 > and this is what I found:
 >
 > When I select only the PK of the table ie:
 >
 > select id from cps_common_draft  where fk_value = 1001201
 >
 > it DOES do an index seek on the non clustered index.  However, if I add
 > one of the address fields, it goes back to a full clustered scan:
 >
 > select id, address_1 from cps_common_draft  where fk_value = 1001201
 
 Yes, this is expected. When you do "SELECT id", the query can
 be evaluated from the index alone. No need to access the data pages.
 I assume here that id is in the clustered index, and recall that
 non-clustered indexes as row locatotr uses the keys of the clustered
 index.
 
 When you add a column which is not in the index, the index seek must be
 combined with a bookmark lookup. Now, for a narrow selection, index
 seek + bookmark lookup is a good thing. But for a wide selection,
 this can be a disaster.
 
 The FK value you have problems with appear 159514 times according
 to the statistics in your other posting. This means 159514 bookmark
 lookups, or 159514 pages access. Your table has five million rows.
 Permit me to assume a row size of 50: 50 * 5000000 / 8192 = 30518
 pages to scan the table, if it's completely unfragmented. As you
 can see, the clustered index scan is a lot cheaper in this case.
 
 --
 Erland Sommarskog, SQL Server MVP, esquel@sommarskog.se
 
 Books Online for SQL Server SP3 at
 http://www.microsoft.com/sql/techinfo/productdoc/2000/books.asp
  Navigation: [Reply to this message] |