其中使用子查询查看的子句和临时表需要特别长的时间



当我在 (xxxx) 中使用从视图中选择 * 并使用 sub 查询(一个简单的 id 列表)时,执行时间比简单地输入数字列表要长近 1000 倍,下面的示例。

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 查询中的值选择可以忽略不计

所有的帮助将不胜感激。

这是您的查询:

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) 上有索引,则此查询应该没问题。

最新更新