快速业务通道

加速你的Hibernate引擎(上) - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22
承映射”已经说得很清楚了,所以我们将关注SQL生成和针对每个策略的调优建议。

以下是HRD中范例的类图:

4.2.1 每个类层次一张表

只需要一张表,一条多态查询生成的SQL大概是这样的:

select id, payment_type, amount, currency, rtn, credit_card_type from payment

针对具体子类(例如CashPayment)的查询生成的SQL是这样的:

select id, amount, currency from payment where payment_type=’CASH’

这样做的优点包括只有一张表、查询简单以及容易与其他表进行关联。第二个查询中不需要包含其他子类中的属性。所有这些特性让该策略的性能调优要比其他策略容易得多。这种方法通常比较适合数据仓库系统,因为所有数据都在一张表里,不需要做表连接。

主要的缺点整个类层次中的所有属性都挤在一张大表里,如果有很多子类特有的属性,数据库中就会有太多字段的取值为null,这为当前基于行的数据库(使用基于列的DBMS的数据仓库处理这个会更好些)的SQL调优增加了难度。除非进行分区,否则唯一的数据表会成为热点,OLTP系统通常在这方面都不太好。

4.2.2每个子类一张表

需要4张表,多态查询生成的SQL如下:

select id, payment_type, amount, currency, rtn, credit_card type,          case when c.payment_id is not null then 1           when ck.payment_id is not null then 2           when cc.payment_id is not null then 3           when p.id is not null then 0 end as clazz from payment p left join cash_payment c on p.id=c.payment_id left join     cheque_payment ck on p.id=ck.payment_id left join     credit_payment cc on p.id=cc.payment_id;

针对具体子类(例如CashPayment)的查询生成的SQL是这样的:

select id, payment_type, amount, currency from payment p left join cash_payment c on p.id=c.payment_id;

优点包括数据表比较紧凑(没有不需要的可空字段),数据跨三个子类的表进行分区,容易使用超类的表与其他表进行关联。紧凑的数据表可以针对基于行的数据库做存储块优化,让SQL执行得更好。数据分区增加了数据修改的并发性(除了超类,没有热点),OLTP系统通常会更好些。

同样的,第二个查询不需要包含其他子类的属性。

缺点是在所有策略中它使用的表和表连接最多,SQL语句稍显复杂(看看Hibernate动态鉴别器的长CASE子句)。相比单张表,数据库要花更多时间调优数据表连接,数据仓库在使用该策略时通常不太理想。

因为不能跨超类和子类的字段来建立复合索引,如果需要按这些列进行查询,性能会受影响。任何子类数据的修改都涉及两张表:超类的表和子类的表。

加速你的Hibernate引擎(上)(4)

时间:2010-12-30 infoq 丁雪丰译

4.2.3每个具体类一张表

涉及三张或更多的表,多态查询生成的SQL是这样的:

select p.id, p.amount, p.currency, p.rtn, p. credit_card_type, p.clazz from (select id, amount, currency, null as rtn,null as credit_card type,         1 as clazz from cash_payment union all     select id, amount, null as currency, rtn,null as credit_card type,         2 as clazz from cheque_payment union all     select id, amount, null as currency, null as rtn,credit_card type,         3 as clazz from credit_payment) p;

针对具体子类(例如CashPayment)的查询生成的SQL是这样的:

select 

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号