【问题标题】:Reconciling compiled prepared statement with execs thereafter in a SQL Server profiling session此后在 SQL Server 分析会话中协调已编译的预编译语句与 exec
【发布时间】:2013-06-02 18:46:05
【问题描述】:

我们正在使用 SQL Server 和 GORM (Grails / Hibernate)。

最近我们的 DBA 询问我是否可以在数据库中的某个关键路径表上使用存储过程而不是普通的 Hibernate 准备语句。他并不关心性能或类似的事情,而是解释说,他很难分析 Hibernate 准备好的语句,因为粗略地引用,“在会话中的某个地方,你会得到一个包含 SQL 文本的准备好的语句......然后您只需获得准备好的语句的执行者。在生产系统中协调这两者几乎是不可能的”。

当然,我更愿意在我们的应用程序中使用具有正常插入/更新/删除行为的域类,而不是手动构建/执行准备好的语句。于是我想到了两个问题:

  1. 能否以某种方式配置 SQL Server Profiler,或者是否有一些技术可以更轻松地分析 Hibernate 预准备语句?如果没有...
  2. 是否可以在我的 Hibernate / Grails 应用程序中进行一些非侵入式自定义,以便像往常一样使用域类,但更改后端代码生成(我不知道,也许使用 Hibernate 拦截......也许我可以为特定的插入/更新/删除操作指定要使用的 SP 而不是准备好的语句......或者我可以指出准备好的语句应该有一个固定的“名称”,这可能有助于在分析会话中让 DBA 识别它...)。

更新

从 SQL Server Profiler 会话中获取的示例:

--sp_prepare on first execute
declare @p1 int
set @p1=8
exec sp_prepare @p1 output,N'@P0 int',N'select <columns> from <table> where <primary key> = @P0 ',1
select @p1
go

--sp_execute thereafter
exec sp_execute 8,1
go

【问题讨论】:

  • 您能从 SQL Profiler 发布相关的 SQL sn-ps 吗?他们使用sp_prepare / sp_execute 家族吗?
  • 看起来像 sp_prepare / sp_execute 家人。用 sn-ps 更新。

标签: sql-server hibernate grails profiling grails-orm


【解决方案1】:

如果是 sp_prepare,则有一个 article on SQL Server Central 表示您可以在 Hibernate 配置中将其关闭,例如:

<property name='prepare_sql'>false</property>

看起来 Hibernate 将在关闭此设置的情况下发送参数化查询。这将允许 SQL Server 像准备好的查询一样缓存计划。

但是,有些文章建议没有prepare_sql,Hibernate 会改变parameter size for strings。这将使 SQL Server 的计划缓存失效。您可能需要进一步调查。

【讨论】:

  • 感谢您的提示。看起来您引用的文章是专门针对 NHibernate 的(在某些地方确实与 Hibernate 不同)。但是,在 Hibernate 世界中似乎确实存在类似情况:看起来我们可以在 jTDS JDBC 驱动程序连接字符串上设置 prepareSQL=2 以生成 sp_executesql 而不是 sp_prepare / sp_execute (jtds.sourceforge.net/faq.html)。但前者被认为只是“快”,而后者“更快”......你看到这两种方法之间真的存在显着的性能差异吗?
  • 哦,还有一件事:我的初始测试表明,在 jTDS 连接字符串中带有 prepareSQL=2 的 Hibernate 没有 NHibernate 所具有的字符串的参数大小问题(它总是使用 varchar / nvarchar大小对应于比较中使用的列)。
猜你喜欢
  • 1970-01-01
  • 2010-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-01
相关资源
最近更新 更多