我在我的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");
这个查询也非常快,执行起来不需要时间。
此外,在分析器上我看到了一些奇怪的东西。当从NH执行查询时,统计信息如下:
读取:281702 写入:0
而ADO.NET版本则是:
读取:333 写入:0
有人有任何线索吗?我可以提供哪些信息来帮助诊断问题?
我想可能与某些连接设置有关,但ADO.NET版本正在使用与NHibernate相同的连接。
提前感谢。
更新:
我正在使用NHibernate LINQ。查询很大,但是它是一个分页查询,只获取10条记录。
传递给“exec sp_executesql”的参数为:
@p0 int,@p1 datetime,@p2 datetime,@p3 bit,@p4 int,@p5 int
@p0=10,@p1='2009-12-01 00:00:00',@p2='2009-12-31 23:59:59',@p3=0,@p4=1,@p5=0