hibernate HQL和/或SQL Server性能问题

snvhrwxg  于 2023-10-23  发布在  SQL Server
关注(0)|答案(1)|浏览(166)

我很难理解Hibernate与SQL Server结合使用时的性能问题。
我非常复杂的HQL查询,在where子句中有16个连接和41个参数,看起来像这样:

SELECT ... FROM Employee where Employee.age > 55

在发送到SQL Server之前,Hibernate将其转换为如下所示的SQL:

exec sp_executesql N'select ... from employee e_1 where e_1.age > @P0',N'@P0 bigint',55

我对SQL Server的内部结构了解不多,但根据我的研究,sp_executesql很慢,因为它不支持 * 执行计划 *,还是因为 * 参数嗅探 *?
如果它的目的是慢,为什么Hibernate使用它,我如何才能加快它?我们会很感激你的帮助。

gajydyqb

gajydyqb1#

当查询具有参数时,SQL Server会选择一个将对任何参数值重复使用的查询计划。
当查询在EXE子句中使用文本时,SQL Server将为这些特定参数值编译查询。像WHERE AGE>55这样的情况可能会得到与WHERE AGE>@age不同的计划。
对于不太可能改变计划的文字值,SQL可能会“自动参数化”查询。通常情况下,这是针对像WHERE ID = 1234这样的 predicate ,其中最佳计划实际上并不依赖于特定的值。自动参数化的查询然后可以重新用于其他值。
您可以强制SQL Server在优化计划时使用这些参数值,但代价是必须为每个带有OPTION RECOMPILE查询提示的查询调用创建一个新计划。
看起来Hibernate通过addQueryHint API支持这一点:eg
How to add SQL-Server query hint in Hibernate Criteria API

相关问题