gpt4 book ai didi

sql-server - 从 Nhibernate 执行的查询很慢,但从 ADO.NET 执行的查询很快

转载 作者:行者123 更新时间:2023-12-02 08:36:03 25 4
gpt4 key购买 nike

我的 MVC 应用程序中有一个查询,大约需要 20 秒才能完成(使用 NHibernate 3.1)。当我在 Management studio 上手动执行查询时,需要 0 秒。

我在 SO 上看到过类似的问题,因此我进一步进行了测试。

我使用 Sql Server Profiler 拦截查询,并在应用程序中使用 ADO.NET 执行查询。

我从探查器得到的查询类似于:“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

最佳答案

我的 ADO.NET 和 NHibernate 使用不同的查询计划,并且我在 NH 版本上遭受了参数嗅探的影响。为什么?因为我之前曾使用较小的日期间隔进行过查询,并且存储的查询计划已针对它进行了优化。

后来,当查询大日期间隔时,使用了存储的计划,花了很长时间才得到结果。

我确认这实际上是问题所在,因为一个简单的:

DBCC FREEPROCCACHE -- clears the query-plan cache

再次加快我的查询速度。

我找到了两种方法来解决这个问题:

  • 使用 NH 拦截器向查询注入(inject)“选项(重新编译)”
  • 当预期结果集较小(日期间隔方面)时,向我的 NH Linq 表达式添加虚拟谓词,例如:query = query.Where(true)。这样就会创建两种不同的查询计划,一种用于大型数据集,一种用于小型数据集。

我尝试了这两种方法,都有效,但选择了第二种方法。这有点hacky,但在我的情况下效果非常好,因为数据按日期均匀分布。

关于sql-server - 从 Nhibernate 执行的查询很慢,但从 ADO.NET 执行的查询很快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7753618/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com