当我只选择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并且用于索引扫描,如果该字段作为空传递,则应该忽略该字段。
提前致谢
答案 0 :(得分:0)
答案可能基于查询优化器对您的表和索引的看法 - 包括行大小和适用的统计信息等。
索引不是魔术,它们并不总是有帮助。如果SQL Server选择使用索引,它应该能够有效地在索引上查找索引中包含的内容。但出于同样的原因,如果您要求索引未涵盖的任何信息,那么该数据将位于其他位置(磁盘或内存中),并且需要使用聚簇索引进行交叉引用。
因此,当提出查询时,SQL Server需要做出假设并猜测最佳查询计划。索引要求返回多少行?如果只是点击聚集索引,那么在该过程中需要读取多少数据而不是预期的读取量?执行聚簇索引需要多少次才能获得额外的数据?
那么,要检查的事项:您的索引是否涵盖XML列?如果没有,查询将返回多少行与主表中的行数?您的统计信息是最新的吗?如果你真的想要,可以使用查询提示来强制使用特定的索引,但是你应该首先考虑其他的事情。