mybatis中oracle in>1000的处理
oracle数据库中,如果你使用in,然后括号对应的是一个子查询,当查询出来的结果>1000的时候就会报错。
这个是数据库的规定,我们无法改变它。
如何解决这个问题呢?
现在我看到了三种解决方式:
1、使用in限制范围为1000,那么就使用多个in拼接。
in (x,x,x) or in (y,y,y) or in ...
这种方法我尝试过,感觉最不好用,如果数据量小的话ok,我哪里才几万条数据就卡,相当于执行多条sql语句。
别人的评价:
一般来说,不建议使用很复杂的sql语句。可以简单的认为,sql语句执行的时间复杂度与sql语句的长度相关。
in太多,在数据量过大的时候,可能就不是慢的问题了,而是sql执行线程locked。
常见的处理方式,是将“条件部分符合”的数据一次性全从数据库中拿出来,然后在代码中,遍历这些记录,找出符合条件(in条件)的记录。充分利用服务器的计算能力,以期减少数据库的压力。
2、使用临时表,将in中的内容查询插入临时表中。然后子查询进行匹配。这个我没有尝试。有空试试。
前面以为in对应子查询如果里面的内容>1000会报错,尝试了一下,不报错。
select * from mpmerdtl where agent_ID in(select member_id from mpagent)
3、不要使用in关键字,直接使用表连接。个人感觉这种是速度最快的一种。我出现这问题的时候解决方式就是手写的sql。
left join...
感觉这样看来解决的三种方案,第一种是因为in的数据是集合,不是表中的,所以拆分成1000以内的n个集合进行查询拼接。第二种子查询,第三种连接查询。
欢迎大家见解!