gpt4 book ai didi

.net - NHibernate SQL 查询速度慢

转载 作者:行者123 更新时间:2023-12-04 02:08:23 24 4
gpt4 key购买 nike

我正在使用 LINQ to NH 在应用程序启动时获取一堆数据。我特意加了ToList()强制立即执行查询:

Group group = GetGroup();
Log.Info("started");
var list = Session.Linq<Data>()
.Where(p => p.Group.Id == group.Id)
.OrderByDescending(p => p.Stamp.Counter) /* Stamp is composite mapping */
.Select(p => new
{
Counter = p.Stamp.Counter,
Status = p.Status,
})
.Take(4000)
.ToList();
Log.Info("done");

检查调试日志 NHibernate.SQL logger 给出了以下 SQL,正如预期的那样(当我开始监视时,同样的查询会在 SQL Profiler 中弹出):
SELECT top 4000 this_.Counter as y0_, this_.Status as y1_
FROM [Data] this_
LEFT OUTER JOIN [Group] group1_ ON this_.Group_id=group1_.Id
WHERE group1_.Id = @p0
ORDER BY this_.Counter desc; @p0 = 1

问题是从我的应用程序调用此查询需要 2 分钟才能完成,而在 SSMS 中执行时需要 0.5 秒!实际上,当应用程序正在等待查询完成时,我可以在 SSMS 中执行它并立即获得结果。

您认为这种差异来自哪里?

最佳答案

由于关于您的应用程序的信息不多,我只能猜测。

NH 的性能问题通常由刷新缓存引起。在每次查询之前刷新缓存。当 session 中有很多实体时,可能需要相当多的时间。请尝试以下操作:

Log.Info("Flushing");
Session.Flush();
Session.FlushMode = FlushMode.Never;

Log.Info("Query");
var list = Session.Linq<Data>()
//...
Log.Info("Done");
// for production code, this belongs into a finally block
Session.FlushMode = FlushMode.Auto;

如果确实是flush问题,则需要在事务中的某些点手动flush。关闭自动冲洗时要小心。它可能会导致丑陋的副作用。它非常适合您的交易,我不能告诉您如何以正确的方式实现它。您也可以使用 StatelessSession ,但对我来说它从未奏效(它有一些限制)。您也可以清除 session ,这也要求您确切地知道自己在做什么。

如果不是冲洗问题,就很难追踪。使用 Profiler 来查看它是否真的在 SQL 服务器查询中花费了时间。它甚至可能是 SQL 服务器上的缓存问题。在这种情况下,第一次执行查询需要几分钟,但第二次只需要几秒钟。创建适当的索引可能会有所帮助。在这里,我停止猜测......

关于.net - NHibernate SQL 查询速度慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6859791/

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