使用带有临时表的子查询的视图中的Where子句占用异常长的时间

时间:2016-03-16 22:46:58

标签: sql sql-server temp-tables sql-view

当我使用select * from视图中的(xxxx)中的列并使用子查询(这是一个简单的id列表)时,执行的时间比简单地输入数字列表长1000倍,如下所示。 / p>

A)执行

需要0ms
SELECT Name FROM TMS.dbo.vPerson p WHERE p.personid IN (1,2,3,4)

B)执行

需要3200ms
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 where query中的值的选择可以忽略不计

非常感谢所有帮助。

1 个答案:

答案 0 :(得分:0)

这是您的查询:

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)

嵌套子查询是不必要的。如果您在tcPerson(personid)#persons(personid)上有索引,则此查询应该没问题。

相关问题