c# - Nhibernate,非常慢的查询,我做错了吗?

标签 c# nhibernate

在询问特定的 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/

相关文章:

c# - 从另一个表单访问字符串

c# - JSON 字符串到 C# 中的模型/HashMap/字典

c# - 使用 Visual Studio 2013 处理 SQLITE 数据库

c# - NHibernate 不插入 child

c# - 谁在调用错误 View ,为什么?

c# - Convert.ToInt32(x) 与 (int)x 相同

c# - 如何使用 MVC 清理和验证 ViewModel?

c# - NServiceBus 对 NHibernate 的使用是否会在使用 Log4Net 进行日志记录时暴露出来?

nhibernate - Fluent NHibernate Automapping 与抽象基类

nhibernate - 流利的NHibernate映射-状态模式