1

基本上在我的应用程序中,我使用以下代码根据页面上的选择来构建我的表达式。

Expression<Func<T, bool>> expr = PredicateBuilder.True<T>();
expr = expr.And(b => b.Speed >= spec.SpeedRangeFrom && b.Speed <= spec.SpeedRangeTo);
...

它倾向于以带有多个“或”和“与”条件的长表达式结束。

完成表达式的构建后,我将其传递到我的存储库,如下所示:

var results = Session.Query<T>().Where(expr).ToList();

问题是花了很长时间才给我返回结果。我还注意到,表达式越长,返回结果集所需的时间就越长。

我还使用 NHibernate profiler 来分析生成的 sql 语句。在 SQL Server Studio 上单独运行 sql 语句,只用了不到 1s。

在我看来,大部分时间都花在构建表达式或将表达式转换为 sql 语句上。

有没有办法解决这个问题?

我没有太多使用 NHibernate 的经验。如果有人能对此有所了解,那就太好了。

提前感谢您抽出宝贵时间阅读本文。

4

1 回答 1

1

除了返回的行数之外,重要的是表中的总行数。

在 SQL Server Studio 上单独运行 sql 语句,只用了不到 1s。

以这种方式进行测试可能会产生误导。查询的第二次运行受益于先前编译的 SQL 语句、先前计算的查询执行计划、先前填满的数据缓冲区。此外,通过直接在 sql 中将所有参数名称替换为其值来进行测试将导致不同的执行计划。

我要做的第一件事是检查索引的错误使用(缺少相关索引或过时的统计信息)

这可以通过查看估计的查询执行计划来完成。至于统计数据,请查看:https ://dba.stackexchange.com/q/12004

我想这也应该很有用:从 Nhibernate 执行的查询很慢,但从 ADO.NET 执行的查询很快

请参阅下文,以使用稍微清理的环境测试 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
于 2013-03-21T13:41:05.410 回答