Sql 使用带有临时表的子查询查看时的Where子句花费了异常长的时间

Sql 使用带有临时表的子查询查看时的Where子句花费了异常长的时间,sql,sql-server,temp-tables,sql-view,Sql,Sql Server,Temp Tables,Sql View,当我在xxxx中使用select*from view where列并使用sub query(一个简单的id列表)时,执行所需时间几乎是输入数字列表所需时间的1000倍,如下例 A需要0毫秒才能执行 SELECT Name FROM TMS.dbo.vPerson p WHERE p.personid IN (1,2,3,4) SELECT personid INTO #persons FROM tcPerson p WHERE p.personid IN (1,2,3,4) SELECT N

当我在xxxx中使用select*from view where列并使用sub query(一个简单的id列表)时,执行所需时间几乎是输入数字列表所需时间的1000倍,如下例

A需要0毫秒才能执行

SELECT Name FROM TMS.dbo.vPerson p WHERE p.personid IN (1,2,3,4)
SELECT personid INTO #persons FROM  tcPerson p WHERE p.personid IN (1,2,3,4)
SELECT Name FROM TMS.dbo.vPerson p 
WHERE p.personid IN (SELECT personid FROM #persons)
B执行需要3200毫秒

SELECT Name FROM TMS.dbo.vPerson p WHERE p.personid IN (1,2,3,4)
SELECT personid INTO #persons FROM  tcPerson p WHERE p.personid IN (1,2,3,4)
SELECT Name FROM TMS.dbo.vPerson p 
WHERE p.personid IN (SELECT personid FROM #persons)
我已经确保每次都清除缓存,但似乎没有合理的理由来解释为什么需要这么长时间

临时表实际上只是一个包含4个ID的列表。可以忽略它的创建,而where查询中的值选择可以忽略不计

我们将不胜感激

这是您的查询:

SELECT Name
FROM TMS.dbo.vPerson p 
WHERE p.personid IN (SELECT personid
                     FROM TMS.dbo.tcPerson p
                     WHERE p.personid IN (SELECT personid FROM #persons)
                    )
有时,IN比查询的其他版本更难优化。你可以通过看执行计划来判断。我注意到,此查询相当于:

SELECT Name
FROM TMS.dbo.vPerson p 
WHERE p.personid IN (SELECT personid FROM TMS.dbo.tcPerson p) AND
      p.person_id IN (SELECT personid FROM #persons)

嵌套子查询是不必要的。如果您在tcPersonpersonid和PersonPersonid上有索引,那么这个查询应该很好。

有点混乱,A执行1个查询,B执行5个查询。。。您的上一个语句在整个语句中有3个查询,有4个select,但是,单独选择personid最多只需要1毫秒,这将剩下3000秒的时间。好的,但是在您写入它的行上,有些linq实际上没有执行。。所以A可能还没有处理linq。您需要访问它。在秒表上画一行,找出哪个查询需要时间,因为a一点也不像B。。。B的第一行是肯定的。。但它仍然在另一端的容器上。。一个可能是本地内存,另一个可能是远程重载sql server,没有索引。表定义(包括索引和查询计划)通常有助于性能优化。如果改为使用EXISTS on,会怎么样?实际的临时表是从一个更大的查询中派生出来的,该查询只会生成for值返回。如果我取这4个值并单独运行,我会得到与上面相同的值,但是在重新阅读时仍然是一个有效点,我注意到您是正确的,我不需要子查询select id,并相应地进行了更新,然而,问题仍然存在,从temp表中选择为视图的where子句提供一个包含4个id的列表需要花费大量时间