首先声明,我没有真正用过Hibernate做项目,只是有初浅了解而已,在这里提出这个问题,只是因为昨天在和公司的DBA探讨问题的时候有感而发,望大家多多拍砖。
我们公司做的是一个省级数据集中的大型系统,数据库采用的是Oracle,应用采用的是Struts1.2,数据库访问方面是采用直接构造、执行SQL的做法。昨天遇到这么个问题,发现一条sql语句执行非常慢,要好几分钟才能出结果。如下:
select b.unit 单位编号,
c.unit_name 单位名称,
c.address 地址,
c.link_man 联系人,
c.tel 电话,
c.remark 备注,
count(distinct b.cust_Id) 客户数,
count(a.user_id) 用户数
from
user a,
cust b,
unit c
where a.cust_id=b.cust_id
and b.unit=c.unit_login_name
and b.county_code='0801'
and c.unit_login_name='0801U04283'
group by b.unit,c.unit_name,c.address,c.link_man,c.tel,c.remark
order by c.unit_name
公司DBA做了一点点修改,执行时间马上缩短到两秒钟,修改过的语句如下:
select b.unit 单位编号,
c.unit_name 单位名称,
c.address 地址,
c.link_man 联系人,
c.tel 电话,
c.remark 备注,
count(distinct b.cust_Id) 客户数,
count(a.user_id) 用户数
from
user a,
cust b,
unit c
where a.cust_id=b.cust_id
and b.unit=c.unit_login_name
and b.county_code='0801'
and c.unit_login_name='0801U04283'
and a.county_code='0801'
and c.county_code='0801'
group by b.unit,c.unit_name,c.address,c.link_man,c.tel,c.remark
order by c.unit_name
只是加了两段看似没有实际意义的条件判断(加粗字体处,但在数据库优化上有意义,加了这两句就能利用到表的分区、索引)在性能上就得到了质的提高。
我想问的问题是:
1、采用Hibernate生成的sql语句是否能自动做这样的优化?这里采用的是自然连接,是不是Hibernate生成的sql语句会根据数据库的不同采用更好的优化过的语句?
2、如果Hibernate不能自动做这样的优化,是不是只能自己去用Hibernate的脚本语法去写类sql语句?或者有更好的解决方案?
[该贴被dd_macle于2007年06月29日 11:00修改过]
[该贴被dd_macle于2007年06月29日 11:01修改过]