0

以下一组查询大约需要 15ms 才能完成,这对我来说太长了,所以我想对其进行优化。

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。这对我来说似乎效率很低,我认为 anINNER 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. 我认为这是因为IN对每一行进行了检查。

问题

  1. 这两组查询在功能上是否等效,函数要返回所有具有Idin 的行@tabl
  2. 有没有我没有考虑过的更快的替代方案?
4

1 回答 1

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));
于 2013-09-24T13:49:13.040 回答