Nhibernate生成普通的sql查询而不是执行语句

时间:2012-11-29 22:48:44

标签: nhibernate

使用SQL profiler,我能够在

中找到从Nhibernate生成的查询
EXEC sp_executesql N'select ...' 

方式。
我想知道是否有任何办法迫使Nhibernate生成普通的

Select ...
而是

声明。

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

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

我刚发现此链接Why does sp_executesql run slower when parameters are passed as arguments

而且我相信流行的答案(现在有4票)可以很好地解释原因。

所以现在的问题是

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

4 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

您应该在服务器上清除执行计划,然后尝试使用agian:

DBCC FREEPROCCACHE

和/或您可以通过在查询中注入选项(重新编译)来强制重新编译执行计划。

答案 2 :(得分:0)

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

答案 3 :(得分: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>