基本上在我的应用程序中,我使用以下代码来构建表达式,具体取决于页面上的选择。
Expression<Func<T, bool>> expr = PredicateBuilder.True<T>();
expr = expr.And(b => b.Speed >= spec.SpeedRangeFrom && b.Speed <= spec.SpeedRangeTo);
...
它倾向于最终表达多个&#34;或&#34;和&#34;和&#34;条件。
完成构建表达式后,我将其传递到我的存储库,如下所示:
var results = Session.Query<T>().Where(expr).ToList();
问题是我花了这么长时间才把结果归还给我。我还注意到表达式越长,返回结果集所需的时间就越长。
我还使用NHibernate profiler来分析生成的sql语句。在SQL Server Studio上单独运行sql语句,只需不到1秒。
在我看来,大部分时间花在构建或转换表达式为sql语句。
有没有办法解决这个问题?
我在使用NHibernate方面没有多少经验。如果有人能对此有所了解,那就太棒了。
提前感谢您花时间阅读本文。
答案 0 :(得分:1)
超过返回的行数,表格中的总行数很重要。
在SQL Server Studio上单独运行sql语句 只有不到1秒。
以这种方式测试可能会产生误导。第二轮查询受益于先前编译的SQL语句,先前计算的查询执行计划,先前填充的数据缓冲区。 此外,通过直接在sql中替换所有参数名称及其值来进行测试将导致不同的执行计划。
我要做的第一件事就是检查索引的错误用法(缺少相关索引或过时的统计数据)
这可以通过查看估计的查询执行计划来完成。 至于统计数据,请查看:https://dba.stackexchange.com/q/12004
我想这也应该有用:Query executed from Nhibernate is slow, but from ADO.NET is fast
请参阅下文,了解如何使用稍微清理的环境测试SQL-SERVER语句。
为每个查询运行此批处理以比较执行时间和统计结果(不在生产环境中运行):
DBCC FREEPROCCACHE
GO
CHECKPOINT
GO
DBCC DROPCLEANBUFFERS
GO
SET STATISTICS IO ON
GO
SET STATISTICS TIME ON
GO
-- your query here
GO
SET STATISTICS TIME OFF
GO
SET STATISTICS IO OFF
GO