加速你的Hibernate引擎(下)

4.6 HQL调优

4.6.1 索引调优

HQL看起来和SQL很相似。从HQL的WHERE子句中通常可以猜到相应的SQL WHERE子句。WHERE子句中的字段决定了数据库将选择的索引。

大多数Hibernate开发者所常犯的一个错误是无论何时,当需要新WHERE子句的时候都会创建一个新的索引。因为索引会带来额外的数据更新开销,所以应该争取创建少量索引来覆盖尽可能多的查询。

4.1节让你使用一个集合来处理所有可能的数据搜索条件。如果这不太实际,那么你可以使用后端剖析工具来创建一个针对应用程序涉及的所有 SQL的集合。基于那些搜索条件的分类,你最终会得到一个小的索引集。与此同时,还可以尝试向WHERE子句中添加额外的谓语来匹配其他WHERE子句。

范例7

有两个UI搜索器和一个后端守护进程搜索器来搜索名为iso_deals的表。第一个UI搜索器在unexpectedFlag、dealStatus、tradeDate和isold属性上有谓语。

第二个UI搜索器基于用户键入的过滤器,其中包括的内容除tradeDate和isold以外还有其他属性。开始时所有这些过滤器属性都是可选的。

后端搜索器基于isold、participantCode和transactionType属性。

经过进一步业务分析,发现第二个UI搜索器实际是基于一些隐式的unexpectedFlag和dealStatus值来选择数据的。我们还让tradeDate成为过滤器的必要属性(为了使用数据库索引,每个搜索过滤器都应该有必要属性)。

鉴于这一点,我们依次使用unexpectedFlag、dealStatus、tradeDate和isold构造了一个复合索引。两个UI搜索器都能共用它。(顺序很重要,如果你的谓语以不同的顺序指定这些属性或在它们前罗列了其他属性,数据库就不会选择该复合索引。)

后端搜索器和UI搜索器区别太大,因此我们不得不为它构造另一个复合索引,依次使用isold、participantCode和transactionType。

4.6.2绑定参数 vs.字符串拼接

既可以使用绑定参数构造HQL的WHERE子句,也可以使用字符串拼接的方法,该决定对性能会有一定影响。使用绑定参数的原因是让数据库一次解析 SQL,对后续的重复请求复用生成好的执行计划,这样做节省了CPU时间和内存。然而,为达到最优的数据访问效率,不同的绑定值可能需要不同的SQL执行计划。

例如,一小段数据范围可能只返回数据总量的5%,而一大段数据范围可能返回数据总量的90%。前者使用索引更好,而后者则最好使用全表扫描。

建议OLTP使用绑定参数,数据仓库使用字符串拼接,因为OLTP通常在一个事务中重复插入和更新数据,只取少量数据;数据仓库通常只有少量SQL查询,有一个确定的执行计划比节省CPU时间和内存更为重要。

要是你知道你的OLTP搜索对不同绑定值应该使用相同执行计划又该怎么办呢?

Oracle 9i及以后版本在第一次调用绑定参数并生成执行计划时能探出参数值。后续调用不会再探测,而是重用之前的执行计划。

时间: 2024-05-11 10:52:48

加速你的Hibernate引擎(下)的相关文章

加速你的Hibernate引擎(上)

1.引言 Hibernate是最流行的对象关系映射(ORM)引擎之一,它提供了数据持久化和查询服务. 在你的项目中引入Hibernate并让它跑起来是很容易的.但是,要让它跑得好却是需要很多时间和经验的. 通过我们的使用Hibernate 3.3.1和Oracle 9i的能源项目中的一些例子,本文涵盖了很多Hibernate调优技术.其中还提供了一些掌握Hibernate调优技术所必需的数据库知识. 我们假设读者对Hibernate有一个基本的了解.如果一个调优方法在Hibernate 参考文档

MySQL数据库InnoDB引擎下服务器断电数据恢复方法_Mysql

说明: 线上的一台MySQL数据库服务器突然断电,造成系统故障无法启动,重新安装系统后,找到之前的MySQL数据库文件夹. 问题: 通过复制文件的方式对之前的MySQL数据库进行恢复,发现在程序调用时找不到数据库中的表,造成网站无法正常访问. 分析: 1.MySQL数据库,使用拷贝文件方式来恢复数据库,只支持MyISAM引擎: 2.如果有数据库或数据表使用了InnoDB引擎,恢复的时候,必须连同MySQL数据库目录下的ibdata1文件一起拷贝过来. 解决办法: 1.停止MySQL服务 serv

PHP在innodb引擎下快速代建全文搜索功能简明教程【基于xunsearch】_php技巧

本文实例讲述了PHP在innodb引擎下快速代建全文搜索功能的方法.分享给大家供大家参考,具体如下: 需要准备的设备:Liunx(Centos)操作系统(只支持Linux),PHP环境. 这里介绍一个国人开发的搜索引擎开源项目-讯搜(xunsearch),它分为:索引服务器和搜索服务器. 在CentOS下面愉快的代建服务器 wget http://www.xunsearch.com/download/xunsearch-full-latest.tar.bz2 tar -xjf xunsearch

MySQL数据库InnoDB引擎下服务器断电数据恢复

说明: 线上的一台MySQL数据库服务器突然断电,造成系统故障无法启动,重新安装系统后,找到之前的MySQL数据库文件夹. 问题: 通过复制文件的方式对之前的MySQL数据库进行恢复,发现在程序调用时找不到数据库中的表,造成网站无法正常访问. 分析: 1.MySQL数据库,使用拷贝文件方式来恢复数据库,只支持MyISAM引擎: 2.如果有数据库或数据表使用了InnoDB引擎,恢复的时候,必须连同MySQL数据库目录下的ibdata1文件一起拷贝过来. 解决办法: 1.停止MySQL服务 serv

spring-请问在Spring+Hibernate框架下连接两个数据库

问题描述 请问在Spring+Hibernate框架下连接两个数据库 两个数据库都是MySql的,一个在我本机,一个在我同事那,在ApplicationContext.xml里配两个DataSource,还需要配置哪些? 然后我在dao使用时怎么分别查询不同数据库的数据? 抱歉啊,新用户,没那个C币. 解决方案 http://blog.sina.com.cn/s/blog_454a9dc001012d6a.html 解决方案二: spring+hibernate下连接两个以上的数据库

Groovy模板引擎下(The MarkupTemplateEngine引擎细节介绍)

模板格式 1.1基础: 模板包含Groovy代码,下面详细具体的解析一下第一个样例: xmlDeclaration() (1) cars { (2) cars.each { (3) car(make: it.make, model: it.model) (4) } (5) } 1 渲染XML的声明字符串 2 打开一个cars标签 3 cars是模板数据模型的一个变量包含了所有的car实例 4 遍历每一项,从car实例创建car标签 5 关闭上述的cars标签 模板可以使用通常的Groovy代码,

天猫网上卖车布局加速 或将冲击线下汽车销售行业

天猫在网上销售汽车的布局正在加速. "2012年天猫商城总共卖出近1万台车.去年底解决了POS线下尾款支付的问题,而且随着POS机的产品优化和后续天猫售车新模式推出,今年销售额有望冲击30亿."天猫商城一位公关人员这样对<投资者报>记者说道. 而另一方面,阿里金融"信用支付"业务也将于4月份在湖南和浙江初步试水,虽然现在只是针对消费者在无线终端的小额贷款业务, 但是天猫商城的上述公关人员表示,"如果用户有需要,不排除未来会去和金融业务和汽车业务

云计算加速落地云存储成“下一个金矿”

IT厂商开发的各种云存储服务只是云存储产业中一个简单的应用.在中国蹒跚起步的云存储产业中,还有更多的诱人"蛋糕"在等待各路掘金者. 本报记者 戈清平报道 作为云计算落地项目的排头兵,云存储最近成了各高新区.IT厂商眼中的"香饽饽". 去年4月27日,郑州高新区"数据银行"项目一期工程顺利验收通过,标志着国内第一个以"云存储"技术实现的可运营的共享式数据存储备份中心正式投入使用:今年5月4日,云海创想云存储产业基地和无锡城市云计

was6.0.17+spring+hibernate+myfaces下CPU占用率异常上升

问题描述 概况:一个300在线用户的系统web服务器(8CPU+8G)windows2003adv+jdk1.4.2+was6.0.17+ihs数据库(8CPU+8G)AIX5.3+oracle10gspring2.0+hibernate3.2+myfaces1.13系统已运行了2年:数据库外键连接较多,查询相对较慢,如查询某些报表会耗费最长45秒(但并发数不超过5)was同时部署2个类似应用(如给两个地区的用户使用),这2个应用通过hibernate默认连接池同时连接上述oracle服务器系统