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

07-06-29 dd_macle
         

首先声明,我没有真正用过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修改过]

         

1
robertlyc
2007-06-29 14:56

你的思路反了,使用hibernate重点不室在于sql/hql语句的优化上

而是在于对象缓存和二级缓存上,在实际工程中,缓存的命中远远胜过对sql语句优化上。

dd_macle
2007-06-29 18:23

to robertlyc:

"而是在于对象缓存和二级缓存上,在实际工程中,缓存的命中远远胜过对sql语句优化上",对那些变化不大的数据,用缓存是ok的,但对于我这边的省级集中,数据在飞快增加的应用,我觉得只能缓存那些配置信息、用户基本信息等基本不变的数据,业务数据怎么缓存呢?

dd_macle
2007-06-30 12:40

想听听banq大哥的意见:)

cnng007
2007-07-03 11:24

关注中..............

2Go 1 2 下一页