Sql server Hibernate查询在系统中运行缓慢,但直接运行时运行速度很快

Sql server Hibernate查询在系统中运行缓慢,但直接运行时运行速度很快,sql-server,sql-server-2005,hibernate,performance,Sql Server,Sql Server 2005,Hibernate,Performance,我有一个类似于本周播客的问题 我们有一个使用hibernate和SQLServer2005的Java应用程序 Hibernate正在为我们生成一个查询,这个查询需要将近20分钟才能完成 如果我们使用show_sql进行相同的查询,并用常量值替换问号,则会立即返回答案 我认为我们需要一个选项(重新编译),但我不知道如何使用HQL实现这一点 请帮忙 您应该发布映射和HQL语句。如果您在HQL中使用“join”,您可能想看看Hibernate到底获取了什么。结果可能是请求本身很简单,但Hibernat

我有一个类似于本周播客的问题

我们有一个使用hibernate和SQLServer2005的Java应用程序

Hibernate正在为我们生成一个查询,这个查询需要将近20分钟才能完成

如果我们使用show_sql进行相同的查询,并用常量值替换问号,则会立即返回答案

我认为我们需要一个选项(重新编译),但我不知道如何使用HQL实现这一点


请帮忙

您应该发布映射和HQL语句。如果您在HQL中使用“join”,您可能想看看Hibernate到底获取了什么。结果可能是请求本身很简单,但Hibernate在到达请求之前获取了大量数据。

根据我的经验,Hibernate中复杂查询的主要问题不是查询本身,而是创建表示结果集的所有对象

在我的工作中,我们有一个非常大的域模型,有很多耦合,因此即使从数据库中获取一个对象也相当昂贵,因为该对象链接到其他对象,而其他对象又链接到其他对象等等


对我们来说,更多地使用延迟加载至少解决了部分问题。智能缓存的帮助更大。我学到的是,在未来,我将允许域类之间有更多的松散耦合。

从您对问题的描述来看,听起来您好像遇到了参数嗅探。从本质上讲,SQL Server是基于传入的一组旧参数值创建查询计划的,这些参数值不会为当前运行的查询创建有效的执行计划


通常,我通过将参数值传递到局部变量并在查询中使用这些参数值或使用OPTION(重新编译)来解决此问题。但是,由于您使用的是Hibernate,我通常的解决方案不适合您。据我所知,最好的选择是使用Hibernate使用prepareStatement()或createSQLQuery()运行本机SQL查询,不幸的是,这会消除使用Hibernate的一些好处。

其他Hibernate查询是否正常?请发布Hibernate对象和查询代码及其生成的SQL。Kees,Yess,其他查询执行正常。令人遗憾的是,hibernate对象和查询代码太复杂,无法共享。谢谢你,耶利米。这就是我最终得到的解决方案,在Hibernate中生成语句,然后检索SQL并直接执行它。本文对此进行了解释: