SQL更新语句上的索引扫描

时间:2014-11-28 09:54:40

标签: sql performance tsql indexing

我有以下SQL语句,我想提高效率。通过执行计划,我可以看到@newWebcastEvents上有一个Clustered Index Scan。有没有办法让我成为一个寻求?或者还有其他方法可以使下面的效率更高吗?

declare @newWebcastEvents table (
    webcastEventId int not null primary key clustered (webcastEventId) with (ignore_dup_key=off)
)

insert into @newWebcastEvents
select wel.WebcastEventId
from WebcastChannelWebcastEventLink wel with (nolock)
where wel.WebcastChannelId = 1178

Update WebcastEvent
set WebcastEventTitle = LEFT(WebcastEventTitle, CHARINDEX('(CLONE)',WebcastEventTitle,0) - 2)
where
WebcastEvent.WebcastEventId in (select webcastEventId from @newWebcastEvents)

1 个答案:

答案 0 :(得分:1)

@newWebcastEvents表变量只包含唯一的一列,并且您在此where子句中要求该表变量的所有行

where
   WebcastEvent.WebcastEventId in (select webcastEventId from @newWebcastEvents)

因此,对此聚簇索引执行搜索通常是毫无意义的 - SQL Server查询优化器无论如何都需要该表变量的所有列,所有行 ....所以它选择索引扫描。

无论如何,我认为这不是性能问题。

如果您需要从大表中选择非常少量的行(< =原始行数的1-2%),则索引搜索很有用。然后,通过聚集索引导航树并查找涉及的那些行比扫描整个表更有意义。但是,这里有一个int列和15行 - >寻求它绝对没有意义,只需在一次扫描中读取这15个int值就可以快得多,并且可以用它完成......

更新:不确定它在性能方面是否有任何差异,但我个人通常更喜欢使用加入而不是选择"连接&#34 ;两张桌子:

UPDATE we
SET we.WebcastEventTitle = LEFT(we.WebcastEventTitle, CHARINDEX('(CLONE)', we.WebcastEventTitle, 0) - 2)
FROM dbo.WebcastEvent we
INNER JOIN @newWebcastEvents nwe ON we.WebcastEventId = nwe.webcastEventId