小弟现在是要做一个这样的事情,一个日志的查询系统。这个日志要从4个表中查出来,每个表有几十万条数据(以后可能增长到几百万条)。  我现在用的是最平常的子查询,可是java中出报出内存溢出的异常(偶尔能查询出来,不过那速度真的忍受不了),我就想问问各位大侠你们怎么处理这样的大数据量,而且有复杂的关联关系的查询啊? 
   问题表述不清,还请各位多多包涵。

解决方案 »

  1.   


    我给你说说我的现在的情况吧。 
    有 柜员表  机构表  日志表 账户表  每个表都是十万级别的数据(很快会到百万),数据库用的是DB2  流程是这样的:先根据柜员查出他所在的机构,然后根据机构查询出下面所有的账户,最后根据账户查出所有相应的日志。  我现在用的是最平常的 IN 查询,但是这样导致内存溢出了,而且速度也异常慢,想问问各位大侠有没有解决办法。
      

  2.   

    弱弱的 回复一下  用  exists  能不能好一点呢
      

  3.   


    更弱弱的问一句,exists怎么用捏?
      

  4.   

    很快会到百万 用的是最平常的 IN 查询 肯定慢尝试优化一下可以用join 代替子查询 会好点
      

  5.   

    是啊    用什么语句能把in替换了    in查询的真是太慢了!!!!!!!
      

  6.   

    db2没有使用过,Oracle里面有function,可以使用function来优化下
      

  7.   

    用join代替in
    join前先进行过滤查询
      

  8.   

    用join代替in 
    exists 代替in。select * from tbl1 where col1 in (select col2 from tbl2);
    ---->exists 代替in
    select * from tbl1 where exists (select 1 from tbl2 where tbl1.col1=tbl2.col2);
    ---->join代替in 
    select tbl1.* from tbl1,tbl2 where tbl1.col1=tbl2.col2;
    select tbl1.* from tbl1 left join tbl2 on tbl1.col1=tbl2.col2;
      

  9.   


    刚才经理走了,所以上不了网。。
    我刚才修改了一下语句,现在放上来,请各位看看有什么需要修改的。
    select * from sys_logs sl left outer join (select ct.accno from client ct left outer join (select depno from depart dt2,(select dt.deproot,dt.depleader from depart dt,clerks ck where ck.depno = dt.depno and ck.clkno ='1010101') as tb1 where dt2.deproot=tb1.deproot and dt2.depleader=tb1.depleader) as tb2 on tb2.depno = ct.depno) as tb3 on tb3.accno = sl.optarget;
      

  10.   


    机构表 Depart 有字段 depno
    柜员表 Clerks 有字段  depno clkno
    账户表 Client 有字段 accno
    日志表 Sys_logs 有字段 accno
      

  11.   

    你先试着做下优化吧 首先是代码的逻辑 看是否有可以去掉的循环之类的
    然后再优化数据库 
    加索引之流 让逻辑读次数尽量降到最低
    然后再优化一下sql
    四个百万的联合查询 你那个慢的太离谱了
      

  12.   

    还是要看看 sql语句怎么写的 楼主 贴 一贴 sql吧 
    我们好帮你分析
      

  13.   

    select sl.* from sys_logs sl,clients ct,clerks ck,depart dt
    where sl.optarget = ct.accno
    dt.depno = ct.depno
    ck.depno = dt.depno
    and ck.clkno='1010101'
      

  14.   

    应该就是我写的,全连接即可。
    不知道db2的优化规则。oracle9i及以前版本中,基于规则的优化器(RBO),要求把能过滤最多数据的条件放在where最后(从右向左解析),把数据量最小的表作为驱动表(from后的最后一个)等等。
    具体查询性能优化要看你的db2了。
      

  15.   

    不行,你那sql语句子查询太多了,建议写个存储过程,还有要建立索引
      

  16.   

    索引  
    sql语句优化
    jvm缓存设置一般来说,尽量保证你的sql语句走的是索引而不是全表
    一次查询的数量不要太多
      

  17.   


    如果有这么简单我也不会问了,应该是我表达不清楚吧。数据库用的是db2  数据访问层是用的hibernate,我觉得用hibernate太慢了,直接jdbc还好些,不过改动又非常大, 郁闷
      

  18.   

    其实我觉得,如果数据量过大的话,可以使用分批次处理.或者写成存储过程.这样会好很多.大量的数据使用T-SQL语句处理本来效果就不会太理想
      

  19.   

    建议:优化你的SQL 不知道DB2有没有EXPLAIN的功能,我用ORACLE是有的如果优化以后还是慢,使用存储过程,建立一个临时表,把数据插入到临时表,再进行处理,处理完了以后就删除临时表的内容。