相关子查询详细执行计划

时间:2013-11-18 18:10:21

标签: sql-server

我试图理解,相关的子查询是如何工作的。我正在执行下面的查询,它给出了我想要的输出,但我很难想象它是如何工作的

select top 5* from persons where personid in (select personid from tbpersons where Persons.ConsolidatedStatusID >50)

根据我的理解,第一个内部查询完全执行(虚拟表1),必须执行外部查询以获取具有合并状态> 50(虚拟表2)的行,并且两者都将被比较,留下VT1 with personids和outerquery将被执行。

这个解释实际上并不符合我的想法,我正在看tbpersons的表扫描,根据我的理解,我可以使用,但我也应该看到人员的表扫描,我没有看到。

我能够把它写成一个连接,仍然无法弄清楚,相关的子查询是如何工作的

 select top 10 * from 
 persons rg
 join
tbpersons sy
 on sy.personid =rg.personid
 where rg.ConsolidatedStatusID>50

请你帮我看看如何使用虚拟表逐步执行执行..

1 个答案:

答案 0 :(得分:2)

第一个查询中的所有子查询中的第一个不是相关的子查询。这是因为它不引用外部查询。它将在外部查询之前执行,并且只执行一次。然后子查询返回的结果将传递给外部查询的IN运算符 对外部查询返回的每条记录执行相关的子查询,语法类似于..

SELECT Col1, Col2 , ....
FROM Table_Name T1
WHERE Col3 > ( SELECT Col1
               FROM Table_Name2
               WHERE Col2 = T1.Col2)   --<--- Reference to the outer query

现在为什么您的查询导致表扫描,这取决于您的查询可用的索引以及查询中使用的运算符。通过查看您提供的有关查询的信息,很难回答为什么要进行表扫描的问题,如果您有一个覆盖查询。