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