NHibernate Query会减慢其他查询的速度

时间:2016-07-20 14:46:38

标签: asp.net sql-server nhibernate ssms

我正在编写一个程序,其中我使用NHibernate使用两个数据库查询。第一个查询是一个很大的选择 - 选择两个连接(大的SELECT查询),其结果大约是50000条记录。查询大约需要30秒。程序的下一步是遍历这些50000记录并在每个记录上调用查询。这个查询是相当小的COUNT方法。

有两件有趣的事情很难:

  1. 如果我在大SELECT之前运行小COUNT查询,COUNT查询大约需要10ms,但如果我在大SELECT查询后运行它需要8-9秒。此外,如果我减少大SELECT查询的复杂性,我也减少了之后执行COUNT查询的时间。

  2. 如果我在sql server management studio上运行大的SELECT查询需要1秒,但是从ASP.NET应用程序需要30秒。

  3. 所以有两个主要问题。为什么在ssms中如此快速地在查询中执行查询需要这么长时间?为什么大的SELECT查询会影响之后的小COUNT查询。

    我知道这个问题有很多可能的答案,但我已经搜索了很多,这就是我尝试过的:

    1. 设置asp.net应用程序和ssms的SET参数,使它们相同,以避免不同的查询计划
    2. 清除ssms缓存,以便ssms缓存不会导致良好的ssms结果 - 缓存清除后的相同1秒结果
    3. 大的SELECT查询:

       var subjects = Query
                  .FetchMany(x => x.Registrations)
                  .FetchMany(x => x.Aliases)
                  .Where(x => x.InvalidationDate == null)
                  .ToList();
      

      小COUNT查询:

      Query.Count(x => debtorIRNs.Contains(x.DebtorIRN.CodIRN) && x.CurrentAmount > 0 && !x.ArchivationDate.HasValue && x.InvalidationDate == null);
      

1 个答案:

答案 0 :(得分:0)

事实证明,上面提到的FatchMany对于该程序是不可避免的,所以我不能跳过。我实现的第一个重大改进是关闭应用程序的loggs(因为我提到上面的代码只是一个片段)。没有日志的性能大约快一半。但是仍然需要相当长的时间。所以我决定避免使用NHibernate进行此查询,并将简单的sqlQuery写入数据读取器,而不是解析到我的对象中。我能够将执行时间从2.5天(50000 * 4秒 - >小查询数量*一个小查询的前执行时间)减少到8分钟。