最近在工作中用到oracle的in函数,但是该函数的参数个数存在上限(1000)的限制,而且涉及查询的两个表还在两个不同的数据库中,就无法使用exists函数来替代in的使用了。但还是总结一下in与exists的用法差异。
1.in适用于内表比外表数据量小的场景:select * from testA a where a.client_id in (select * from testB)。
原因:in方法下,oracle会执行两个for循环遍历,外循环次数为testA的数据,内循环次数为testB的数据。如果testB的数据量超过testA,很明显执行效率会降低,只有testB的数据量小于testA时,才适合选择in方法;
2.exists适用于内表数据多于外表的场景:select * from testA a where exists (select * from testB b where a.client_id=b.client_id)。
原因:exists方法下,oracle会执行外表和内表的遍历查询,外循环次数为testA的数据,内循环次数也是testA的数据量大小。所以当内表数据量小于外表时,采用in,内表数据量大于外表时,采用exists,内表等于外表时,两者性能相当。