当我使用select * from视图中的(xxxx)中的列并使用子查询(这是一个简单的id列表)时,执行的时间比简单地输入数字列表长1000倍,如下所示。 / p>
A)执行
需要0msSELECT Name FROM TMS.dbo.vPerson p WHERE p.personid IN (1,2,3,4)
B)执行
需要3200msSELECT 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中的值的选择可以忽略不计
非常感谢所有帮助。
答案 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)
上有索引,则此查询应该没问题。