`
yinjia11
  • 浏览: 11301 次
  • 性别: Icon_minigender_2
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

Hql的祸

阅读更多
程序写的好不好,就看代码写的怎样,仔细看下面2条hql语句,有什么不同:

1.    from SinoASNDetail a where a.asn.warehouse = :warehouse and a.asn.receivedTime >= :beginTime and a.asn.receivedTime <= :endTime and a.item.id in (select b.id from SinotransItem b where b.customHouse=:itemcode)

2.    select distinct a from SinoASNDetail a ,SinotransItem item where a.item.id = item.id and a.asn.warehouse = :warehouse and item.customHouse=:itemcode and a.asn.receivedTime >= :beginTime and a.asn.receivedTime <= :endTime order by a.asn.receivedTime asc

查询出来的结果都一样,可是效率确完全不一样.小数据量或许没有什么区别,如果你让它循环几十次做这样的查询,区别就出来了.

偶今天的实践证明,用第一条hql查询的报表(因某种原因循环20余次),一分钟不到得到结果;用第二条hql查询,2分钟多点.

再来看看是谁惹的货,看见上面橙色字体没,distinct 和 order by ,就是这2个家伙了.切记切记啊.还有,不要随随便便的用笛卡尔集合进行查询,苦头有的吃.

分享到:
评论
14 楼 pioneer21th 2006-11-10  
yinjia11 写道
很久没有来,不好意思.
看了大家的回复,觉得效率这个问题真的跟很多方面有关,深受启发.
另外说一下为什么我的那两个sql为什么有如此差别,我这边查询的表中基础数据量很大,但是执行查询后出来的记录并不多,也就几十条这个样子.同时在order by后面的字段也不在索引中,所以导致使用order by的效率并不好,这也是为什么最后测试得到的结果是在程序中进行排序效率较优的原因.
偶是新手,对效率优化这方面的东西所知甚少,只是在程序开发中碰到实在是慢的出奇的情况下才会考虑下做优化,但是所知不多,最后发现总是不知道从什么地方下手,看来还需要多多学习,谢谢大家的回复,获益非浅.
用子查询效率高吗?一般来说,在同等条件下,子查询没有连接查询的效率更高,楼主的第二条HQL可以把item.houseWarse=:itemCode放在where的第一个查询,再把第一条也加上order by,再看看.事实不仅于此,In语法的效率通常都不是最好的,除非你确定在子查询里返回的数据比较少时才用子查询,要不然效率比连接查询差.
13 楼 yinjia11 2006-11-10  
很久没有来,不好意思.
看了大家的回复,觉得效率这个问题真的跟很多方面有关,深受启发.
另外说一下为什么我的那两个sql为什么有如此差别,我这边查询的表中基础数据量很大,但是执行查询后出来的记录并不多,也就几十条这个样子.同时在order by后面的字段也不在索引中,所以导致使用order by的效率并不好,这也是为什么最后测试得到的结果是在程序中进行排序效率较优的原因.
偶是新手,对效率优化这方面的东西所知甚少,只是在程序开发中碰到实在是慢的出奇的情况下才会考虑下做优化,但是所知不多,最后发现总是不知道从什么地方下手,看来还需要多多学习,谢谢大家的回复,获益非浅.
12 楼 Godlikeme 2006-11-08  
ansern 写道
order by字段做了索引影响较大,以前经历过一个50-60万记录的表使用某个存储过程要2分钟以上,后来做了个时间的索引,不到2秒了。

另外感觉第2条sql,不考虑order by的话,本身就比较慢的。distinct之前把所有记录取了出来,再排除,而第1个是先排除了那些记录才取结果。


这种层次的优化数据库是会做的
11 楼 lovevirus 2006-11-05  
直接查询po也不对,如果你要真的有这么大数据量查询,那也只能投影查询,或者直接用jdbc吧,呵呵
10 楼 ansern 2006-11-05  
order by字段做了索引影响较大,以前经历过一个50-60万记录的表使用某个存储过程要2分钟以上,后来做了个时间的索引,不到2秒了。

另外感觉第2条sql,不考虑order by的话,本身就比较慢的。distinct之前把所有记录取了出来,再排除,而第1个是先排除了那些记录才取结果。
9 楼 dwangel 2006-11-04  
关键看你order by的字段是不是做了索引。
如果没做,然后整体数据集比较大的话,数据库会比较慢。
另外,你这里是关联属性的order,实际上会查很多次关联表,
性能就比不上查出来,再排序了。
8 楼 为你而来 2006-11-03  
楼主,如果取数据库中记录来进行排序呢,不会对我说几百万条记录一下子取出来放在集合啊,然后再时行排序吧
7 楼 Godlikeme 2006-11-03  
hql应该只是sql的抽象。这个例子说明不了什么问题,sql的效率和记录数量有很大关系,且数据库都在执行时探寻最优、次优的等价查询语句。再者,搂主举的例子,两条语句并不等价,order by 本身是high cost 的,而第一句却没有。还有,集合操作的问题,一般来说,如果是一次操作,可以直接在sql中做order by,还有很多情况下,是把一个很大的recordset先拿出来,在程序里面对部分数据做处理,这种情况还是在程序里面做比较快,。
6 楼 xmx0632 2006-11-03  
yinjia11 写道
这里只是想说一下效率的问题,因为测试的时候发现在hql中使用order by确实大大降低了查询的效率,当然如果你一定要在查询的时候顺便排序的话,order by也不是不可以.不过似乎查询出list以后在程序中使用Collections.sort()的效率要更快些


如果数据量大的话,每次查询都要获得全部结果集,在程序里排序,这样只能降低效率吧?
5 楼 lordhong 2006-11-03  
select distinct a from SinoASNDetail a ,SinotransItem item

你这里就有table a x item 大的matrix在内存里,还加个distinct,table的full scan很浪费的。

第一个查询只是两个table分开的scan,当然效率高点。

order by是数据库搞定的,和HQL无关。
4 楼 yinjia11 2006-11-03  
xiaoych 写道
噢?有这样的事情?

我没有具体测试和深入研究过,所以只能靠想象说话了。我认为hql的order by其实也是翻译成sql的order by,由数据库来执行的。效率低的话,应该是数据库效率低。另外,我认为数据库排序应该会比我们的应用程序排序更快……
数据库使用的是mysql,我在程序中排序确实比在hql中排序要快的.不晓得是不是因为mysql的缘故呢?
3 楼 xiaoych 2006-11-02  
噢?有这样的事情?

我没有具体测试和深入研究过,所以只能靠想象说话了。我认为hql的order by其实也是翻译成sql的order by,由数据库来执行的。效率低的话,应该是数据库效率低。另外,我认为数据库排序应该会比我们的应用程序排序更快……
2 楼 yinjia11 2006-11-02  
这里只是想说一下效率的问题,因为测试的时候发现在hql中使用order by确实大大降低了查询的效率,当然如果你一定要在查询的时候顺便排序的话,order by也不是不可以.不过似乎查询出list以后在程序中使用Collections.sort()的效率要更快些,具体使用的时候根据个人需求取舍了
1 楼 step21 2006-11-02  
如果不用order by,你怎么进行排序呢?

相关推荐

    HQL语句 HQL语句

    HQL语句 HQL语句 HQL语句 HQL语句 HQL语句

    hql ppt Hql PPt

    Hql PPt Hql PPt

    HQL Eclipse Plugins 配置教程

    不喜欢使用myEclipse的...最近在项目中使用Hibernate,由于需要使用HQL,找了很多资料,大都是MyEclipse中自带的HQL工具。 由于MyEclipse是收费的,速度不是很理想。所以在网上找到了一个elipse插件 英文图文教程 ...

    HQL语法入门学习HQL语法入门学习

    在深入探讨HQL语法之前,我们首先需要理解什么是HQL。HQL,全称为Hibernate Query Language,是Hibernate框架提供的一种面向对象的查询语言。与SQL(Structured Query Language)不同,HQL是专为ORM(Object-...

    hql语句 使用大全

    ### HQL语句使用大全 HQL(Hibernate Query Language)是一种面向对象的查询语言,它提供了灵活而强大的数据检索方式,使开发人员能够更高效地与数据库交互。本文将详细介绍HQL的基本用法及高级特性。 #### 1. ...

    全面解析HQL语句 非常详细直接的HQL语句的功能介绍

    标题:“全面解析HQL语句 非常详细直接的HQL语句的功能介绍” 描述:“非常详细直接实用的HQL语句的功能介绍看过的人保准都说好” 本篇文章将深入探讨HQL(Hibernate Query Language)的核心功能及其在数据查询...

    精通HQL(word格式)

    【HQL基础】 HQL,全称Hibernate Query Language,是Hibernate框架提供的面向对象的查询语言,它类似于SQL,但更专注于对象模型而非数据库表结构。HQL是Hibernate官方推荐的检索数据的主要方式,因为它能够更好地...

    HQL查询pdf资料

    ### HQL查询详解 HQL(Hibernate Query Language)是一种面向对象的查询语言,它提供了与SQL类似的功能,但更贴近于面向对象编程的思维方式。HQL允许开发人员以一种更自然的方式查询数据库,同时保持了Java对象模型...

    sql转换hql工具

    之前写好SQL,再到代码里面来写,语句复杂的看的时不时细节会忘记,用sql转换hql工具,直接贴近了就可以了;

    精通HQL.doc

    本文将深入探讨HQL(Hibernate Query Language),它是Hibernate框架内官方推荐的查询语言,类似于SQL但更加面向对象。 HQL的基础在于它的语法与SQL相似,但更侧重于对象的查询,而不是数据库表。例如,你可以通过...

    精通hibernate HQL语言

    在深入探讨Hibernate的HQL语言之前,我们先理解一下什么是HQL。HQL,全称Hibernate Query Language,是Hibernate框架提供的一种面向对象的查询语言,它的语法结构与SQL相似,但主要针对对象和实体进行操作,而不是...

    HQL查询及语法

    ### HQL查询及语法详解 #### 一、HQL简介 HQL,全称为Hibernate Query Language,是Hibernate框架提供的一种面向对象的查询语言。它基于SQL标准,但更加强调对象模型,支持Java中的对象关系映射(ORM),能够处理...

    HQL语言大全 高清晰可复制版

    HQL,全称为Hibernate Query Language,是Hibernate框架中的查询语言,它允许开发者以类似SQL的方式查询对象。在Java开发中,尤其是在处理大量数据持久化时,Hibernate作为一个强大的对象关系映射(ORM)工具,极大...

    HQL语句大全HQL语句大全

    ### HQL语句详解 #### 一、HQL简介 HQL(Hibernate Query Language)是Hibernate框架中的查询语言,它提供了面向对象的方式来进行数据库查询。HQL语法接近于SQL但又有所不同,它允许开发者以面向对象的方式来表达...

    Hibernate查询语言HQL.PPT

    Hibernate 查询语言 HQL Hibernate 查询语言 HQL 是一种面向对象的查询语言,用于检索对象。它提供了灵活多样的查询机制,包括导航对象图、通过标识符检索、使用 HQL 检索对象、使用 Hibernate 条件 API 和使用本地...

    hibernateHQL关联查询

    ### Hibernate HQL 关联查询详解 #### 一、引言 在进行数据库操作时,关联查询是必不可少的一部分,尤其在处理复杂的数据结构时更是如此。Hibernate作为一种流行的Java持久层框架,提供了强大的对象关系映射(ORM...

    HQL批量插入、更新和删除

    ### HQL批量插入、更新和删除 #### 一、概述 在进行数据库操作时,批量处理数据是一项常见的需求。为了提高效率并减少网络传输开销,HQL(Hibernate Query Language)提供了一种灵活的方式来实现这一目标。HQL是...

    HQL详解

    **HQL详解** Hibernate Query Language(HQL)是Hibernate框架中的对象关系映射查询语言,它允许开发者以面向对象的方式书写查询,而无需关心底层数据库的SQL语法。HQL是SQL的一个面向对象的版本,提供了更为简洁且...

    Hibernate之HQL查询

    在Hibernate中,HQL(Hibernate Query Language)是其内置的一种面向对象的查询语言,它是SQL的面向对象版本,用于检索和操作持久化对象。HQL查询的使用极大地提高了开发效率,因为它将数据操作与具体的数据库结构...

Global site tag (gtag.js) - Google Analytics