2014-01-24 160 views
0

当我选择唯一的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为空或@EndDate为NULL,去索引扫描,如果给定值为null应该忽略的领域。提前

+0

你可以在哪里发布两个* actual *执行计划吗? –

+0

它生成巨大的XML,我会尝试 – Roninn

+0

你是如何定义你的聚集索引?你能发布定义它的脚本吗?实际执行计划的屏幕截图也会有所帮助。 –

回答

0

感谢答案很可能会基于什么查询优化器认为你的表和index--包括,除其他事项外,行大小以及适用的统计信息。

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

因此,当提出查询时,SQL Server需要做出假设并猜测最佳查询计划。索引查询会返回多少行?如果该过程需要读取多少数据,而不是读取聚集索引时要读取的预期数量?需要多少次执行聚集索引才能获取更多数据?

所以,要检查的事情:您的索引是否覆盖了XML列?如果不是,您的查询将返回多少行与主表中的行数?你的统计资料是否最新?如果你真的想要,你可以使用查询提示来强制使用一个特定的索引,但你应该首先查看这些其他的东西。

相关问题