In
表示一个确定的值在一个集合中找出对应的值!
我理解的执行是这样啊,先计算出子查询的结果,然后把相关的结果临时存放,也就产生一个集合(但这个表在执行过程只是运行一次后生成一个结果集)
然后主表读取一行数据,对应列的值在集合一个个配对,找到就显示该行,(如果集合中有两个相同的值会点样做,我猜IN要全部扫描整个集合,才返回)
然后再读取取第二行,对应列的值在集合一个个配对,找到就显示该行
如此类推
再后就返回相关的数据
Exist
表示在指定一个子查询,检测行的存在
先读取主表第一行数据,然后再在子查询全表查询(从第一行查)主表中对应列的值是否存在,一发现有就立即返回,不再向下查询(有可能不是整个表都扫描过),
然后再读取主表第一行数据,又再在子查询表查询(也是从第一行查)主表中对应列的值是否存在,一发现有就立即返回,不再向下查询(有可能不是整个表都扫描过),
点解in适合内大外小的查询,exits适合内小外大的查询 我还是想不能点解??有待说明!!!
我的理触是这样啊,外表数据比较小,但内表的数据比较大,例如外表A 只有两个行数据,而内表B 有1000,如果用In的话,IO大约操作次数=2(外表两行)*1000(内表行数)
如果有EXIST的话,外表的每一行在内表中扫描行数<=1000,也就是每一行扫描的行数有可能<1000,也就行两行扫行总次数<2000,(因为数据分布的问题),
通常Exist比In 快,
“in适合内大外小的查询,exits适合内小外大的查询”对这个不知点解释,找不对例子来说明!