关于用了Hibernate之后如何进行SQL优化的问题

水哥驿站 2007-06-29 11:01:20
首先声明,我没有真正用过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语句?或者有更好的解决方案?
...全文
312 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
水哥驿站 2007-07-25
  • 打赏
  • 举报
回复
给分
zqrqq 2007-06-29
  • 打赏
  • 举报
回复
>>>用native SQL功能感觉回到了自己写sql的做法,不能充分利用hibernate了
这时一种误解
水哥驿站 2007-06-29
  • 打赏
  • 举报
回复
to zqraa:
用native SQL功能感觉回到了自己写sql的做法,不能充分利用hibernate了,有没更好的办法呢?
zqrqq 2007-06-29
  • 打赏
  • 举报
回复
用hibernate的native SQL功能,尽量复用DBA的工作,这样运行效率也相对较高!
水哥驿站 2007-06-29
  • 打赏
  • 举报
回复
看来只有用nagive SQL这一招了:<

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧