在询问特定的 nhibernate 问题时,我遇到了一些主要的性能问题。
我有两个表,A 和 B,其中 A 有大约 4000 行,B 有大约 50000 行。 A和B之间是一对多的关系。
所以我问的问题需要加载 A 中的所有实体,然后强制加载 B 中的所有实体,因为我想聚合 B 中的实体。
我正在使用 fluenthibernate 并将其配置为允许延迟加载,这适用于所有其他问题,除了我必须加载约 50000 个实体的问题,这个数字可能会以每月 50k 的速度增长。现在问这个问题需要一分钟以上(可能更慢)
我已经做过的明显优化:只创建一个 session 工厂,不关闭延迟加载。
所以我的问题是,nhibernate 在这方面会变慢吗? (也就是说,我应该用常规的 SQL 问题而不是 nhibernate 来构建我的 DAL 吗?)或者有没有办法提高性能。这是一个报告应用程序,因此不会有很多并发用户,但我仍然想让这个问题至少花费 5-10 秒。
编辑 添加代码:
public class ChatSessions
{
public virtual int Id { get; set; }
public virtual IList<ChatComments> Comments { get; set; }
public ChatSessions()
{
Comments = new List<ChatComments>();
}
}
public ChatCommentsMapping()
{
Id(x => x.Id);
References(x => x.ChatSession);
}
public class ChatComments
{
public virtual int Id { get; set; }
public virtual ChatSessions ChatSession{ get; set; }
public virtual string Comment { get; set; }
public virtual DateTime TimeStamp { get; set; }
public virtual int CommentType { get; set; }
public virtual bool Deleted { get; set; }
public virtual string ChatAlias { get; set; }
}
public ChatSessionsMapping()
{
Id(x => x.Id);
References(x => x.ChatRoom)
.Not.LazyLoad();
HasMany(x => x.Comments)
.Table("chatcomments");
}
然后在我的 repo 中我使用这个查询:
public IList<ChatComments> GetChatCommentsBySession(int chatsessionid)
{
using(var session = _factory.OpenSession())
{
var chatsession = session.Get<ChatSessions>(chatsessionid);
NHibernateUtil.Initialize(chatsession.Comments);
return chatsession.Comments;
}
}
每个聊天 session 都会调用一次该方法。
然后我聚合的查询看起来像这样:
foreach (var hour in groupedByHour){
var datetime = hour.Sessions.First().StartTimeStamp;
var dp = new DataPoint<DateTime, double>
{
YValue = hour.Sessions.Select(x =>
_chatCommentsRepo.GetChatCommentsBySession(x.Id).Count)
.Aggregate((counter,item) => counter += item),
XValue = new DateTime(datetime.Year, datetime.Month, datetime.Day, datetime.Hour, 0, 0)
};
datacollection.Add(dp);
}
最佳答案
选择任何大小的 50,000 行永远不会很快,但可以考虑使用子选择提取策略 - 它应该在您的场景中工作得更好。此外,请确保您的数据库中有外键的索引。
There's an example of what could be happening at the NHProf site
编辑:我强烈推荐NHProf如果您正在使用 NHibernate 进行任何工作 - 这是获得胜利的快速方法。
关于c# - Nhibernate,非常慢的查询,我做错了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6829493/