0

使用 SQL 探查器,我能够找到从 Nhibernate 生成的查询是在

EXEC sp_executesql N'select ...' 

时尚。
我想知道是否有任何方法可以强制 Nhibernate 生成平原

Select ...

而是声明。

我想要这个的原因是因为显然 SQL Server 为它们生成了不同的执行计划,在我的场景中,普通的“select ...”运行得更快。

------更新----- 2012 年 11 月 30 日

我刚找到这个链接Why does sp_executesql run slow when parameters are passed as arguments

而且我相信流行的答案(到目前为止有 4 票赞成)很好地解释了原因。

所以现在的问题是

我可以使用 nhibernate 生成直接查询而不是参数化查询吗?

4

4 回答 4

0

在您的会话工厂配置中,您可以启用ShowSql. 这将在您调试时将生成的 SQL 查询输出到输出窗口。您需要确保将您的设置BatchSize为 0 以查看所有查询。如果启用了批处理,您将无法看到它分组的查询(以优化性能)。

NHibernate Profiler 也是一个用于调试代码的无价(但商业)工具。http://www.hibernatingrhinos.com/products/NHProf

于 2012-11-29T23:01:19.630 回答
0

你应该在你的服务器上清除你的执行计划,而不是尝试 agian:

DBCC FREEPROCCACHE

和/或您可以通过将 option(recompile) 注入查询来强制重新编译执行计划。

于 2012-11-29T23:01:46.897 回答
0

不,NHibernate 使用 sp_executesql 向 SQL Server 发出命令,这不能更改。但是,您应该能够对任何慢速查询进行故障排除以解决性能问题。我想要做的第一件事是检查 sp_executesql 调用提供的参数是否与它们引用的列具有相同的数据类型。

于 2012-11-30T13:57:10.113 回答
0

Nhibernate 使用 log4net,您只需要添加一个附加程序,如此处所述,以防您使用 log4net:

https://devio.wordpress.com/2010/04/14/logging-sql-statements-generated-by-nhibernate/

例如:

<appender name="DebugSQL" type="log4net.Appender.FileAppender">
  <param name="File" value=".\nhdb.log"/>
  <param name="AppendToFile" value="true" />
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern
      value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
  </layout>
</appender>

<logger name="NHibernate.SQL" additivity="false">
  <level value="DEBUG" />
  <appender-ref ref="DebugSQL" />
</logger>
于 2018-08-14T03:18:12.130 回答