一条HQL的变迁--由584.14s->16.886s

事先申明,本人是菜鸟,口下留情。这个语句是用来计算负荷率的。计算的是每天的负荷率(峰电量+谷电量+平电量)/24/最高负荷的。先看看语句优化的过程,请高手解析这些语句的差异与优劣。
用词错误!!不叫优化,叫纠错(网友教的。。。)。。呵呵……菜鸟给个反面教材而已了。这些是我学习hibernate过程中弄出来的一个东西。。并非真正项目里的……。

(1)先看原始语句。
"select sum(model.peakQuantityElectricity+model.valleyQuantityElectricity+model.normalQuantityElectricity)/24/(dpss.wangGongFuHe+dpss.faDianFuHe)"
+" from DdRecord model,DatedPowerSupplyState dpss where model.recHost.hostType = 'SUPPLY_STATION' or model.recHost.hostType='POWER_PLANT' "
+"and model.date>=? and model.date<=? and dpss.date=model.date group by model.date"

执行耗时 584.12s,谢谢网友提示,这是个不对的hql语句。结果集大了很多,所以慢很多,应该将 model.recHost.hostType = 'SUPPLY_STATION' or model.recHost.hostType='POWER_PLANT' 部分括起来。
(2)先将中间or两个条件合并行,使用in语句(估计不好,好像见过说最好别用in的说法,不过我不知道如何改)。
"select sum(model.peakQuantityElectricity+model.valleyQuantityElectricity+model.normalQuantityElectricity)/24/(dpss.wangGongFuHe+dpss.faDianFuHe)"
+" from DdRecord model,DatedPowerSupplyState dpss where model.recHost.hostType in ('SUPPLY_STATION' ,'POWER_PLANT') "
+"and model.date>=? and model.date<=? and dpss.date=model.date group by model.date"

居然有了很大提升,耗时17.5s
(3)想了想觉得DdRecord表中记录与DatedPowerSupplyState的记录数量的不同可能对语句有影响,试试调整下语句,调整如下:
"select sum(model.peakQuantityElectricity+model.valleyQuantityElectricity+model.normalQuantityElectricity)/24/(dpss.wangGongFuHe+dpss.faDianFuHe)"
+" from DdRecord model,DatedPowerSupplyState dpss where model.recHost.hostType in ('SUPPLY_STATION' ,'POWER_PLANT')"
+" and dpss.date>=? and dpss.date<=? and model.date=dpss.date group by dpss.date"

执行后发现耗时17.7s,似乎没影响,或许还没有2的性能好。
(4)再想想觉得可以试试join 语句看看效果。调整后hql如下:
"select sum(model.peakQuantityElectricity+model.valleyQuantityElectricity+model.normalQuantityElectricity)/24/(dpss.wangGongFuHe+dpss.faDianFuHe)"
+" from DatedPowerSupplyState dpss,DdRecord model inner join model.recHost rechost with rechost.hostType in ('POWER_PLANT','SUPPLY_STATION')"
+" where dpss.date>=? and dpss.date<=? and model.date=dpss.date group by dpss.date"

执行后,发现几乎没有影响,执行时间17.2s
(5)最后,综合了下,选择了以下语句:
"select sum(model.peakQuantityElectricity+model.valleyQuantityElectricity+model.normalQuantityElectricity)/24/(dpss.wangGongFuHe+dpss.faDianFuHe)"
+" from DatedPowerSupplyState dpss,DdRecord model inner join model.recHost rechost with rechost.hostType in ('POWER_PLANT','SUPPLY_STATION')"
+" where model.date>=? and model.date<=? and dpss.date=model.date group by model.date"

耗时间为16.886s,结果还是不满意,最后解决办法多加了个表,每次有记录修改或新增时自动计算当日负荷率,存入这个表中。
综合上边过程提出一些问题:
(1) in语句和join语句使用对性能的影响。
(2)如果不取出这些记录,有无办法直接使用hql对查出来的结果作运算,比如select sqrt(select sum(...) from..) 之类。
(3)记录数量 对于编写hql 分组字段选取 或 条件语句编写等的影响。
恳请赐教。。另外给个语句,讨论下,如何优化:
// 站点名称
		"select rechost.name,"
// 站点统计期内最高负荷
+ "max(model.maximumLoad),"
// 站点统计期内电量累计
+ "sum(model.peakQuantityElectricity+model.valleyQuantityElectricity+model.normalQuantityElectricity),"
// 站点统计期内总无功累计
+ "sum(model.totalReactiveQuantityElectricity),"
// 站点统计期内力率计算
+ "sum((model.peakQuantityElectricity+model.valleyQuantityElectricity+model.normalQuantityElectricity)/sqrt((model.peakQuantityElectricity+model.valleyQuantityElectricity+model.normalQuantityElectricity)*(model.peakQuantityElectricity+model.valleyQuantityElectricity+model.normalQuantityElectricity)+model.totalReactiveQuantityElectricity*model.totalReactiveQuantityElectricity))/count(model.date)"
+ " from RecordHost rechost,DdRecord model where model.recHost=rechost and model.date>=? and model.date<=?"
+ "group by rechost";
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值