小弟现在是要做一个这样的事情,一个日志的查询系统。这个日志要从4个表中查出来,每个表有几十万条数据(以后可能增长到几百万条)。 我现在用的是最平常的子查询,可是java中出报出内存溢出的异常(偶尔能查询出来,不过那速度真的忍受不了),我就想问问各位大侠你们怎么处理这样的大数据量,而且有复杂的关联关系的查询啊?
问题表述不清,还请各位多多包涵。
问题表述不清,还请各位多多包涵。
解决方案 »
- service问题?
- tomcat的unable to compile class for jsp的问题,简单的页面能编译,连接数据库的就不能了。
- 什么时候使用JMS?
- 软件工程试题求解答?求大家给个指导
- 谁有关于Oracle:设计,开发,维护 Web:html,css,javascript 服务器,数据安全 的笔试题呀
- 怎么解决jdbc远程连接速度慢
- session 问题
- 誰用jbuilder调试过struts in action里的例子artimus,我才老是不能通过!!
- SAX能不能操作Dom
- 初学者求请教java正则表达式,匹配不成对的把该字符初始化null,求指点,谢谢了
- 如何实现上传excel,然后解析excel呢?希望大家能指导一下思路
- tomcat 或 jsp中怎么对class文件加密解密
我给你说说我的现在的情况吧。
有 柜员表 机构表 日志表 账户表 每个表都是十万级别的数据(很快会到百万),数据库用的是DB2 流程是这样的:先根据柜员查出他所在的机构,然后根据机构查询出下面所有的账户,最后根据账户查出所有相应的日志。 我现在用的是最平常的 IN 查询,但是这样导致内存溢出了,而且速度也异常慢,想问问各位大侠有没有解决办法。
更弱弱的问一句,exists怎么用捏?
join前先进行过滤查询
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;
刚才经理走了,所以上不了网。。
我刚才修改了一下语句,现在放上来,请各位看看有什么需要修改的。
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;
机构表 Depart 有字段 depno
柜员表 Clerks 有字段 depno clkno
账户表 Client 有字段 accno
日志表 Sys_logs 有字段 accno
然后再优化数据库
加索引之流 让逻辑读次数尽量降到最低
然后再优化一下sql
四个百万的联合查询 你那个慢的太离谱了
我们好帮你分析
where sl.optarget = ct.accno
dt.depno = ct.depno
ck.depno = dt.depno
and ck.clkno='1010101'
不知道db2的优化规则。oracle9i及以前版本中,基于规则的优化器(RBO),要求把能过滤最多数据的条件放在where最后(从右向左解析),把数据量最小的表作为驱动表(from后的最后一个)等等。
具体查询性能优化要看你的db2了。
sql语句优化
jvm缓存设置一般来说,尽量保证你的sql语句走的是索引而不是全表
一次查询的数量不要太多
如果有这么简单我也不会问了,应该是我表达不清楚吧。数据库用的是db2 数据访问层是用的hibernate,我觉得用hibernate太慢了,直接jdbc还好些,不过改动又非常大, 郁闷