尽管具有覆盖非聚集索引,但仍可进行表扫描

时间:2015-03-03 18:52:11

标签: sql sql-server

:dbo.Cache

表定义:

create tABLE DBO.CACHE
(
Serial int identity(1,1) not null Primary Key,
StringSearched nvarchar(30),
RowId int,
ColName nvarchar(30),
PercentMatch decimal(18, 4),
createdAt datetime default getdate(),
modifiedAt datetime default getdate(),
createdBy nvarchar(128) default SUSER_NAME(),
ModifiedBy nvarchar(128) default SUSER_NAME()
)

索引:

create nonclustered index nonclustInd_Cache
            ON Cache(StringSearched, ColName) include( RowId, PercentMatch) --It is a covering index as per the query we have
create nonclustered index nonclustInd_Cache_RowId
ON Cache(RowId)

查询:

INSERT INTO #Temp2(RowNumber,ValFromUser,ColumnName,Percentage) SELECT RowId,StringSearched,ColName,PercentMatch FROM   dbo.Cache AS C WHERE  StringSearched = @email AND colName = 'email'

执行计划:

Execution plan

超过百万行:

enter image description here

问题:

如何避免此表扫描?这个表是一个缓存表将是非常庞大的,我不能在其上进行表扫描。

1 个答案:

答案 0 :(得分:-1)

  

尝试使用forceseek FORCESEEK适用于群集和   非聚集索引寻求操作。 FORCESEEK表提示可能是   当查询计划在a上使用表或索引扫描运算符时很有用   表或视图,但索引查找运算符可能更有效。