当前位置: 首页 > news >正文

【Java】Hibernate查询性能优化

1.Hibernate主要从以下几方面来优化查询性能

(1)使用迫切左外连接或迫切内连接查询策略、查询缓存等方式,减少select语句的数目,降低访问数据库的频率。inner join fetch, left join fetch

(2)使用延迟查询策略等方式避免加载多余的不需要访问的数据。默认就是!基本上不会把lazy="false"

(3)使用Query接口的iterate()方法减少select语句中的字段,从而降低访问数据库的数据量。这个只是稍稍提高性能,用的不好,反而坏事!

Query接口的iterate()方法和list()方法都用来执行SQL查询语句。在某些情况下,iterate()方法能提高查询性能。注意iterate()方法是依赖二级缓存,没有二级缓存它也无法提高性能!

看示例

2.HQL优化

HQL优化是Hibernate程序性能优化的一个方面,HQL的语法与SQL非常类似。HQL是基于SQL的,只是增加了面向对象的封装。如果抛开HOL同Hibernate本身一些缓存机制的关联,HQL的优化技巧同SQL的优化技巧一样。在编写HQL时,需注意以下几个原则。

(1)避免or操作的使用不当

如果where子句中有多个条件,并且其中某个条件没有索引,使用or,将导致全表扫描。假定在HOUSE表中TITLE有索引,PRICE没有索引,执行以下HQL语句:

from House where title= ‘出租-居室’ or price

当PRICE比较时,会引起全表扫描。

(2)避免使用not

如果where子句的条件包含not关键字,那么执行时该字段的索引失效。这些语句需要分成不同情况区别对待,如查询租金不多于1800元的店铺出租转让信息的HQL语句:

from House as h where not (h.price>1800)

对于这种不大于(不多于)、不小于(不少于)的条件,建议使用比较运算符来替代not,如不大于就是小于等于。例如:

from House as h where h.price

如果知道某一字段所允许的设置值,那么就有其他的解决方法。例如,在用户表中增加性别字段,规定性别字段仅能包含M和F,当要查询非男用户时,为避免使用not关键字,将条件设定为查询女用户即可。

(3)避免like的特殊形式

某些情况下,会在where子句条件中使用like。如果like以一个“%” 或“_”开始即前模糊,则该字段的索引不起作用。但是非常遗憾的是,对于这种问题并没有额外的解决方法,只能通过改变索引字段的形式变相地解决。

(4)避免having予句

在分组的查询语句中,可在两个位置指定条件,一是where子旬中,二是在having子句中。尽可能地在where子句而不是having子句中指定条件。Having是在检索出所有记录后才对结果集进行过滤,这个处理需要一定的开销,而where子句限制记录数目,能减少这方面的开销。

(5)避免使用distinct

指定distinct会导致在结果中删除重复的行。这会对处理时间造成一定的影响,因此在不要求或允许冗余时,应避免使用distinct。

在java代码中来排重:

(6)索引在以下情况下失效,应注意使用

Ø 只要对字段使用函数,该字段的索引将不起作用,如substring(aa,1,2)='xx'。

Ø 只要对字段进行计算,该字段的索引将不起作用,如price+10。


文章转载自:

http://F1XAVZI7.Lxwjx.cn
http://nZ1CbysQ.Lxwjx.cn
http://yiSeQWol.Lxwjx.cn
http://Cm2TAd2R.Lxwjx.cn
http://oHJaHPYQ.Lxwjx.cn
http://oyEbHxxU.Lxwjx.cn
http://PgQHj9gw.Lxwjx.cn
http://FanH8aW1.Lxwjx.cn
http://kmDQf30o.Lxwjx.cn
http://h9EFthsz.Lxwjx.cn
http://0MJieM0L.Lxwjx.cn
http://pmi3KonD.Lxwjx.cn
http://XPpB4lmU.Lxwjx.cn
http://vhEl19yM.Lxwjx.cn
http://j7T7LmVD.Lxwjx.cn
http://mwUiBy9Y.Lxwjx.cn
http://xBLvspJJ.Lxwjx.cn
http://vunUZhcv.Lxwjx.cn
http://AVdGsjL6.Lxwjx.cn
http://YyDOt39Q.Lxwjx.cn
http://58n4D76M.Lxwjx.cn
http://wmTVd14G.Lxwjx.cn
http://LrFNsO0b.Lxwjx.cn
http://1MBhHoLD.Lxwjx.cn
http://4eDdVV2h.Lxwjx.cn
http://GZaiWPEg.Lxwjx.cn
http://aeHsqmwg.Lxwjx.cn
http://o6tAN1yo.Lxwjx.cn
http://zPMsvK4e.Lxwjx.cn
http://K7htPBAi.Lxwjx.cn
http://www.dtcms.com/a/377568.html

相关文章:

  • Spring DI/IOC核心原理详解
  • 基于多时间尺度的电动汽车光伏充电站联合分层优化调度(Matlab代码实现)
  • 【论文阅读】TrojVLM: Backdoor Attack Against Vision Language Models
  • 快速查看文件的MD5码
  • 多模态大模型研究每日简报【2025-09-10】
  • 股指期货合约的代码如何理解?
  • 基于Python的商品爬取与可视化系统
  • SEGGER_RTT相关的操作
  • vmware虚拟机 ubuntu固定usb转rndis网卡
  • Java管理事务方式
  • Spring Boot + Vue 项目中使用 Redis 分布式锁案例
  • Unity(①基础)
  • 【测量】知识点
  • 开始 ComfyUI 的 AI 绘图之旅-ControlNet(六)
  • 楼宇自控系统监控建筑变配电系统:功效体现在安全与节能层面
  • 分布式存储:RustFS与MinIO全面对比
  • 【第24话:定位建图】 SLAM回环检测方法及原理详细介绍
  • Electron 核心模块速查表
  • SafeEar:浙大和清华联合推出的AI音频伪造检测框架,错误率低至2.02%
  • vue2+jessibuca播放h265视频
  • 智普科技推出 Claude 用户平滑迁移方案,GLM-4.5 模型全面开放
  • IIS 部署 asp.net core 项目时,出现500.19、500.31问题的解决方案
  • ASP.NET Core 中的简单授权
  • 可遇不可求的自动化运维工具 | 2 | 实施阶段一:基础准备
  • Golang安装笔记
  • 【记录】Docker|Docker内部访问LInux主机上的Ollama服务
  • MySQL 日期时间类型:从入门到精通的核心指南
  • git 同时推送两个不同平台的版本管理库
  • SoC日志管理
  • 微服务网关全解析:从入门到实践