INNER JOIN相当于使用IN吗?

时间:2013-09-24 13:39:37

标签: sql-server-2008 tsql

以下一组查询需要大约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针对每一行进行检查。

问题

  1. 这两组查询在功能上是否相同,其函数是返回Id@tabl的所有行?
  2. 我有没有考虑过更快的替代方案?

1 个答案:

答案 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));