我正在编写一个程序,其中我使用NHibernate使用两个数据库查询。第一个查询是一个很大的选择 - 选择两个连接(大的SELECT查询),其结果大约是50000条记录。查询大约需要30秒。程序的下一步是遍历这些50000记录并在每个记录上调用查询。这个查询是相当小的COUNT方法。
有两件有趣的事情很难:
如果我在大SELECT之前运行小COUNT查询,COUNT查询大约需要10ms,但如果我在大SELECT查询后运行它需要8-9秒。此外,如果我减少大SELECT查询的复杂性,我也减少了之后执行COUNT查询的时间。
如果我在sql server management studio上运行大的SELECT查询需要1秒,但是从ASP.NET应用程序需要30秒。
所以有两个主要问题。为什么在ssms中如此快速地在查询中执行查询需要这么长时间?为什么大的SELECT查询会影响之后的小COUNT查询。
我知道这个问题有很多可能的答案,但我已经搜索了很多,这就是我尝试过的:
大的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);
答案 0 :(得分:0)
事实证明,上面提到的FatchMany对于该程序是不可避免的,所以我不能跳过。我实现的第一个重大改进是关闭应用程序的loggs(因为我提到上面的代码只是一个片段)。没有日志的性能大约快一半。但是仍然需要相当长的时间。所以我决定避免使用NHibernate进行此查询,并将简单的sqlQuery写入数据读取器,而不是解析到我的对象中。我能够将执行时间从2.5天(50000 * 4秒 - >小查询数量*一个小查询的前执行时间)减少到8分钟。