我遇到类似于本周播客的问题。
我们有一个使用Hibernate和Sql Server 2005的Java应用程序。
Hibernate正在为我们生成一个查询,需要将近20分钟才能完成。
如果我们使用show_sql进行相同的查询并用常量值替换问题标记,则立即返回答案。
我认为我们需要选项(重新编译),但我无法弄清楚如何使用HQL。
请帮忙!
答案 0 :(得分:4)
从您对问题的描述来看,这听起来像是在进行参数嗅探。实质上,SQL Server正在基于传入的一组较旧的参数值创建查询计划,这些参数值不会为当前运行的查询创建有效的执行计划。
通常我通过将参数值传递给局部变量并使用查询中的那些或使用OPTION(RECOMPILE)来解决此问题。但是,由于您使用的是Hibernate,我通常的解决方案不适合您。据我了解,最好的选择是使用Hibernate使用prepareStatement()或createSQLQuery()来运行本机SQL查询,遗憾的是,它消除了使用Hibernate的一些好处。
答案 1 :(得分:1)
根据我的经验,Hibernate中复杂查询的主要问题不是查询本身,而是创建表示结果集的所有对象。
在我的工作中,我们有一个非常大的域模型,有很多耦合,所以即使从数据库中取出一个单个对象也是非常昂贵的,因为该对象被链接到其他对象,而这些对象又被链接到其他对象等。
对我们来说,更多使用延迟加载解决了至少部分问题。智能缓存帮助更多。我学到的是,在未来,我将允许域类之间更松散的耦合。
答案 2 :(得分:0)
您应该发布您的映射和HQL语句。如果你在HQL中使用“join”,你可能想看一下Hibernate究竟取得了什么。可能会发现请求本身很简单,但是Hibernate在它到达之前就会获取大量数据。