聚集索引扫描

时间:2014-01-24 21:31:21

标签: sql-server tsql

当我只选择Id时,我没有看到聚集索引扫描,但是当我选择XML列时,我看到了聚簇索引扫描。

索引不是仅用于Where子句而是用于select子句吗?

declare @LenderID int = null,
@LenderCode varchar(64)= null
--Add Lender Search as in Lender Maintenance
if @LenderID is not NULL
  Select @LenderCode = CODE_TX from LENDER 
     where ID = @LenderID and PURGE_DT IS NULL

 declare @StartDate datetime2 = '1/22/2014 12:00:00 AM', 
         @EndDate datetime2 = '1/24/2014 12:00:00 AM'
 select rh.id 
 from  REPORT_HISTORY rh
 where 
 (
   (@StartDate is NULL or @EndDate is NULL)
 or
   (RH.CREATE_DT between  @StartDate and @EndDate)
  )
and
(
   RH.LENDER_ID = @LenderID
or 
   @LenderCode is NULL
)

另外令人惊讶的是,数据库无法处理像@StartDate这样的子句为NULL或@EndDate为NULL并且用于索引扫描,如果该字段作为空传递,则应该忽略该字段。

提前致谢

1 个答案:

答案 0 :(得分:0)

答案可能基于查询优化器对您的表和索引的看法 - 包括行大小和适用的统计信息等。

索引不是魔术,它们并不总是有帮助。如果SQL Server选择使用索引,它应该能够有效地在索引上查找索引中包含的内容。但出于同样的原因,如果您要求索引未涵盖的任何信息,那么该数据将位于其他位置(磁盘或内存中),并且需要使用聚簇索引进行交叉引用。

因此,当提出查询时,SQL Server需要做出假设并猜测最佳查询计划。索引要求返回多少行?如果只是点击聚集索引,那么在该过程中需要读取多少数据而不是预期的读取量?执行聚簇索引需要多少次才能获得额外的数据?

那么,要检查的事项:您的索引是否涵盖XML列?如果没有,查询将返回多少行与主表中的行数?您的统计信息是最新的吗?如果你真的想要,可以使用查询提示来强制使用特定的索引,但是你应该首先考虑其他的事情。