我很难理解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使用它,我如何才能加快它?我们会很感激你的帮助。
1条答案
按热度按时间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