以下一组查询需要大约15毫秒才能完成,这对我来说太长了,所以我想优化它。
INSERT INTO @tabl (Id)
SELECT [Value]
FROM dbo.Split(@Ids,',');
SET @Count = (SELECT COUNT(1) FROM tblOther WHERE Id IN (SELECT Id FROM @tabl));
基本上,它将@Ids
的值拆分为逗号分隔的列表,并将其放入表变量中。然后,它会在另一个表中搜索Id
列表中Ids
的所有记录。这似乎对我来说效率很低,我认为INNER JOIN
可以完成同样的事情。
INSERT INTO @tabl (Id)
SELECT [Value] FROM dbo.Split(@Ids,',');
SET @Count = (SELECT COUNT(1)
FROM tblOther AS t
INNER JOIN @tabl AS s ON s.Id = t.Id)
在两组查询中,我得到相同的结果,但我想知道这是否仅仅是因为我的数据,还是因为它们在功能上是等价的。
使用INNER JOIN
比使用IN
快4倍。我假设这是因为IN
针对每一行进行检查。
Id
中@tabl
的所有行?答案 0 :(得分:1)
我认为你的第一段代码中有拼写错误。如果@tabl中的行数远小于tblOther,您可以通过将第一个查询转换为;来测试自己的假设;
INSERT INTO @tabl (Id) select [Value] FROM dbo.Split(@Ids,',');
SET @Count = (SELECT count(1) from @tabl WHERE Id IN (SELECT Id FROM tblOther));