`
phpxer
  • 浏览: 72087 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

介绍一种性能极差的HQL写法,帮忙分析下原因

阅读更多
后果:

查询时,10000条记录要7分钟!

关联关系:
 public class TrailRecord {
   Long id,
   Knowledge knowledge,
   Date borwseTime
}

public class TrailSession {
  Long id,
  User user,
}
 
查询HQL代码:
		getHibernateTemplate().setMaxResults(amount);
		String hql = "select r.knowledge from TrailRecord r where r.browseTime in (select max(t.browseTime) as btime from TrailRecord t where t.trailSession.user=? and t.knowledge.deleted=false group by t.knowledge) order by r.browseTime desc";
		return getHibernateTemplate().find(hql, new Object[]{user});




生成的SQL:
select knowledge1_.N_BH               as N1_0_,
             knowledge1_.B_Deleted          as B2_0_,
             knowledge1_.C_Content          as C3_0_,
             knowledge1_.D_CreateDate       as D4_0_,
             knowledge1_.N_Type             as N15_0_
        from T_TrailRecord trailrecor0_
       inner join T_Knowledge knowledge1_ on trailrecor0_.N_Knowledge =
                                             knowledge1_.N_BH
       where trailrecor0_.D_BrowseTime in
             (select max(trailrecor2_.D_BrowseTime)
                from T_TrailRecord  trailrecor2_,
                     T_TrailSession trailsessi3_,
                     T_Knowledge    knowledge4_
               where trailrecor2_.N_TrailSession = trailsessi3_.N_BH
                 and trailrecor2_.N_Knowledge = knowledge4_.N_BH
                 and trailsessi3_.N_User = 1
                 and knowledge4_.B_Deleted = 0
               group by trailrecor2_.N_Knowledge)
       order by trailrecor0_.D_BrowseTime desc limit 11


问题已经解决了,但是还是没有完全弄明白生成的SQL为什么这么慢。请帮忙分析下。
分享到:
评论
13 楼 yefeng 2008-09-26  
这种复杂的HQL,就直接写SQL好的,HIBERNATE里不是可以直接执行SQL的嘛
12 楼 jacky2007 2008-09-24  
用EXISTS替代IN
11 楼 rxgp02a 2008-09-08  
楼上几位好像跑题了,现在讨论的是hibernate。
10 楼 nihongye 2008-09-08  
duooluu 写道
还是子查询效率太低了,假如记录数为n,那个子查询会被执行n多次

不能一概而论,只是mysql的实现比较笨
9 楼 duooluu 2008-09-07  
还是子查询效率太低了,假如记录数为n,那个子查询会被执行n多次
8 楼 rainerWJY 2008-09-06  
用in的话最好还是用temp表好些,尤其是对mysql这样的。
字段必须建索引
7 楼 nihongye 2008-09-06  
貌象在where里的子查询,mysql会执行n次子查询,n约等于外部表记录数量。
6 楼 davidgrubby 2008-09-06  
ecsun 写道
尽量不要用in查询

如果不用in能用什么代替呢,不一定是lz的例子,能不能稍微解释一下?谢谢
5 楼 raise 2008-09-05  
[flash=200,200][/flash]
4 楼 wangqj 2007-10-26  
in 比较慢
3 楼 phpxer 2007-10-26  
现在使用的SQL:

select max(this_.D_BrowseTime) as y0_, this_.N_Knowledge as y1_ 
from T_TrailRecord this_ 
inner join T_TrailSession trailsessi1_ 
on this_.N_TrailSession=trailsessi1_.N_BH 
where trailsessi1_.N_User=1 
group by this_.N_Knowledge order by y0_ desc limit 11


只需要2ms
2 楼 phpxer 2007-10-26  
抛出异常的爱 写道
browseTime
索引作了么?

没有给这个字段建立索引。
引用

还有in 这个用法。。。。

有什么问题?
1 楼 抛出异常的爱 2007-10-26  
browseTime
索引作了么?
还有in 这个用法。。。。
用两个单纯的HQL试试查询。。

相关推荐

    Hibernate框架]Hql语句in中带参数的写法

    一、HQL语句in中带参数的写法 在HQL语句中,使用in关键字可以实现集合参数的传递,例如: ```java String hql = "FROM Login login WHERE login.id in (:ids)"; ``` 其中,`:ids`是参数的名称,需要在map中进行设置...

    HQL的几钟常见写法

    ### HQL的几种常见写法 #### 概述 HQL(Hibernate Query Language)是Hibernate框架提供的一种查询语言,它支持面向对象的语法结构,并且能够很好地与Java对象模型进行映射。通过HQL,开发者可以更加灵活地操作...

    Hibernate-HQL语句多对多写法

    "Hibernate-HQL语句多对多写法" Hibernate 是一个流行的 Java 持久层框架,它提供了强大的对象关系映射(ORM)功能,使得开发者可以方便地与数据库交互。但是,在使用 Hibernate 时,我们经常会遇到多对多关系的...

    HQL语句 HQL语句

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

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

    通过上述分析,我们可以看出HQL不仅提供了一种直观的方式来处理数据库查询,而且还包含了丰富的功能,使得数据检索变得更加灵活和高效。这对于开发基于Hibernate的应用程序而言,无疑是一大福音。开发者可以利用HQL...

    HQL 详解 HQL查询

    **HQL(Hibernate Query Language)**是Hibernate框架中推荐的标准查询语言,它是针对对象的查询语言,具有类似于SQL的语法,但更加强调面向对象的特性。HQL被设计用来查询和操作持久化对象,提供了比Criteria查询更...

    血缘关系解析工具源码_对hql集合进行静态分析_获取hql对应的血缘图.zip

    总的来说,血缘关系解析工具的源码分析与HQL集合的静态分析相结合,是数据治理领域中一种强大的工具,它提供了深入洞察数据流动和依赖关系的能力,对于任何处理大规模HQL查询的组织来说都是不可或缺的。通过理解和...

    hql ppt Hql PPt

    Hql PPt Hql PPt

    HQL批量插入、更新和删除

    为了提高效率并减少网络传输开销,HQL(Hibernate Query Language)提供了一种灵活的方式来实现这一目标。HQL是Hibernate框架中的一个核心特性,它允许开发者以面向对象的方式编写查询语句,从而简化了数据库操作...

    hql语句 使用大全

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

    HQL查询pdf资料

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

    HQL Eclipse Plugins 配置教程

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

    HQL是hibernate自己的一套查询

    通过上述介绍可以看出,HQL作为一种面向对象的查询语言,在Hibernate框架中扮演着非常重要的角色。它不仅简化了数据访问层的开发工作,而且还提高了代码的可读性和可维护性。同时,Hibernate还提供了多种查询方式供...

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

    HQL,全称为Hibernate Query Language,是Hibernate框架提供的一种面向对象的查询语言。与SQL(Structured Query Language)不同,HQL是专为ORM(Object-Relational Mapping)设计的,它允许开发者以类和对象的方式...

    Hibernate之HQL查询

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

    HQL简易介绍(DOC文档)

    【HQL简介】 HQL,全称Hibernate Query Language,是Hibernate框架中推荐的主要查询语言。它是面向对象的,设计用于处理持久化对象的查询,同时借鉴了SQL的语法结构,使得开发人员能够以更接近数据库操作的方式进行...

    hql总条数.txt

    根据给定的文件信息,我们可以深入...总之,HQL提供了一种灵活且强大的方式来操作数据库,尤其是在Java环境下集成Hibernate框架时。通过深入理解和熟练掌握HQL查询技巧,可以显著提高数据库操作的效率和程序的健壮性。

    hql模糊查询hql模糊查询

    根据提供的文件信息,本文将详细解析HQL(Hibernate Query Language)中的模糊查询技术,并通过具体的代码示例来阐述不同方式下的实现方法。 ### HQL模糊查询概述 HQL是Hibernate框架提供的一种面向对象的查询语言...

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

    在Java开发中,尤其是在处理大量数据持久化时,Hibernate作为一个强大的对象关系映射(ORM)工具,极大地简化了数据库操作。而HQL作为Hibernate的核心组成部分,它的掌握对于Java开发者来说至关重要。 1. **HQL简介...

    HQL与SQL的区别

    **HQL** 是Hibernate框架中的一种查询语言,它是SQL的一个面向对象的抽象层,旨在简化Java应用程序与数据库之间的交互。HQL支持类名、属性名作为查询语句的一部分,使得查询更接近于面向对象的思维方式,而不是直接...

Global site tag (gtag.js) - Google Analytics