【发布时间】:2014-01-24 21:31:21
【问题描述】:
当我只选择 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 这样的子句并进行索引扫描,如果该字段作为 null 传递,它应该忽略该字段。
提前致谢
【问题讨论】:
-
你能把两个实际执行计划贴在某个地方吗?
-
生成巨大的xml,我试试
-
你是如何定义你的聚集索引的?您可以发布定义它的脚本吗?实际执行计划的屏幕截图也会有所帮助。
标签: sql-server tsql