参数 list 里面装了1000+的 id (字段有索引)
然后根据这个list去数据库(oracle)中查询,请问各位大神,有什么高效的查询方法吗?
oracle的in语句中元素不能超过1000个,不过你可以变通一下,把条件分成两个,然后or一下。id in(...) or id in(...)
如果只是1000左右的话,就不用多线程了,因为多线程需要考虑线程同步与数据合并问题。如果数据太多,那就是程序的设计问题了,怎么会设计成这个样子要一次操纵这么多数据?考虑一下。
添加索引、还有查询时,不要返回不必要的字段,不需要的排序也可去掉,只是个参考,呵呵!
list里面的id先去重,如果本来就没有重复的,就不用这步了。
然后就是楼上的那个方法了。
这个一直都是难题
1.扩大内存,争取时间
2.过多时间,减小内存
内存用多了,代码耗费的时间就少。
时间不在乎的情况,可以减小程序占用的内存,来提高性能
我们的做法是这样的:
List多大,那么就要分析List中的数据,然后去查询数据库,不要一条一条的查,查数据库是很占用资源的。(基本就是查一次数据库)
对于java来说List 1000条根本不算什么。
分析数据,拼写sql的时间基本可以1s内完成。所以不要担心
前台一般也不会一次需要这么大的数据量吧
将list分页后去数据库来取数据
别用in,oracle的in支持的字段有限制
oracle没怎么用过,支持前面朋友提到的将list分批做多次查询然后整合,这里多次查询可用多线程
其实1000多条不算多,不必太关心
如果是利用高级程序语言里数据库编程技术来实现的话,而非在DBMS下直接操作,我觉得可以采用多线程来解决!同时,如果针对海量数据的话,MapReduce将是不错的选择吧!
用临时表是一种不错的选择。
可以数据库新建临时表,查询前插入,使用表关联查询,查询完成后清除临时表数据.其中临时表可以使用数据库自动的事务管理实现..
你应该把业务场景抛出来,为什么需要传1000+的数据去查询啊,
直接插入临时表关联查询,操作完后删除临时表,用in或or效率相当低
利用线程池,根据服务器cpu核心数尽可能的开辟多个线程线程数为:t,list参数分段查询size/t,多个线程共享一个结果集将多个线程查询的结果插入结果集中。
使用map存储,key是唯一标识,value是list中的内容;
map的大小可以根据list的size指定,不存在rehash。
:D 首先你要做同步还是异步?
如果是要实时结果的,你不需要对所有的1000个结果进行查询。
第一种:你可以先取前100个id进行查询。用户只要看前100跳记录就好了。
第二种:把1000个id分组10组,然后启10个线程,每组用一个线程进行查询。然后把查询结果进行汇总。排序。
分页查询,或者合并查询
从一个LIST中查找指定ID的数据,除了循环,肯定就没有别的方法了。不过可以让A传入到B中的list具有一定的顺序格式,这样就方便B应用按照查找算法去查找了。
如果list实在是太大了,循环一次的时间过长,则可以考虑使用多线程,一个线程负责一段查询,也是可以的。
如果数据库中的表的数据过大的话首先加入索引,然后做一下表分析这样可以提高速度,另外针对楼主提出的问题也可以采取将List中的ID取出来用exists去查询数据库,数据库端的查询远比程序中的循环查询快很多的。
把id拼成 (id,id,id,id)
然后in一把就完了。
id要建索引。按情况来看外查询是大表,会走索引的,速度不会慢。
1 如果业务可以分页,用分页每次指定条数
2 不能分页,一次传入1000+的id,用存储过程
如果是从数据库里查询出来的结果放进LIST里,可以改进查询方法,分页查询,先查出总数,再除以分页数+1得到页数,再循环查询,处理结果。
如果只是LIST里的数据占用内存过大,就只能扩大物理内存了。除非改进数据结构
临时表方案是正解
叫我说 最简单的方法是 ,每次查询100个左右 用 in(id1,id2.....)
显然地这样的查询是完全不科学的,要不是需求设计有问题,要不就是数据库设计有问题。尽量做优化吧。