【发布时间】:2011-12-06 21:44:20
【问题描述】:
我的 MVC 应用程序中有一个查询需要大约 20 秒才能完成(使用 NHibernate 3.1)。当我在 Management Studio 上手动执行查询时,需要 0 秒。
我在 SO 上看到过类似的问题,关于与此类似的问题,所以我将测试更进一步。
我使用 Sql Server Profiler 拦截了查询,并在我的应用程序中使用 ADO.NET 执行了查询。
我从 Profiler 得到的查询类似于:“exec sp_executesql N'select....”
我的 ADO.NET 代码:
SqlConnection conn = (SqlConnection) NHibernateManager.Current.Connection;
var query = @"<query from profiler...>";
var cmd = new SqlCommand(query, conn);
SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
return RedirectToAction("Index");
这个查询也很快,不费时间去执行。
另外,我在 Profiler 上看到了一些非常奇怪的东西。该查询在从 NH 执行时具有以下统计信息:
读取:281702 写:0
来自 ADO.NET 的那个:
读取:333 写:0
有人知道吗?我可以提供任何信息来帮助诊断问题吗?
我认为这可能与某些连接设置有关,但 ADO.NET 版本使用的是来自 NHibernate 的相同连接。
提前致谢
更新:
我正在使用 NHibernate LINQ。该查询非常庞大,但它是一个分页查询,只获取了 10 条记录。
传递给“exec sp_executesql”的参数是:
@p0 整数,@p1 日期时间,@p2 日期时间,@p3 位,@p4 整数,@p5 整数
@p0=10,@p1='2009-12-01 00:00:00',@p2='2009-12-31 23:59:59',@p3=0,@p4=1, @p5=0
【问题讨论】:
-
您在 NHib 代码中使用期货还是多标准?
-
尝试使用 nhprof,也许 NH 之后会发出其他查询,可能是 N+1 问题。
-
您好,只有一个查询。我已经用过NHProf
-
@Firo:不,不在这个查询中。
-
很可能是参数嗅探。见"Slow in the Application, Fast in SSMS?"
标签: sql-server performance nhibernate ado.net