我有以下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)
答案 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