使用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生成直接查询而不是参数化查询吗?
答案 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>