• 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个集合进行查询拼接。第二种子查询,第三种连接查询。

    欢迎大家见解!

  • 相关阅读:
    QT学习笔记——06-Day16_C++_QT
    QT学习笔记——06-Day15_C++_QT
    QT学习笔记——06-Day14_C++_QT
    c++提高学习笔记——05-c++STLday13_贪吃蛇案例
    c++提高学习笔记——05-c++STLday12
    c++提高学习笔记——05-c++STLday11
    混子的 后缀数组 刷题记录
    POJ2528Mayor's posters 线段树,离散化技巧
    莫比乌斯反演 刷题记录
    P问题,NP问题,NPC问题学习笔记
  • 原文地址:https://www.cnblogs.com/aigeileshei/p/6113326.html
Copyright © 2020-2023  润新知