Nhibernate 拆分表以提高性能

Nhibernate 拆分表以提高性能,nhibernate,Nhibernate,数据库中我的用户表越来越大(以列而不是行的形式),结果是我的站点的各个区域都变慢了。这是因为每当它对用户表进行连接时,它都试图从用户表中获取每一列 我想我会在用户表中保留所有公共字段,然后将其他字段放在单独的表中。例如,假设我的数据库中有以下表: Users: - UserID (PK, Identity) - UserName - Password ... UsersActivity: - UserID (PK, FK) - LastActivityDate - LastLoginDat

数据库中我的用户表越来越大(以列而不是行的形式),结果是我的站点的各个区域都变慢了。这是因为每当它对用户表进行连接时,它都试图从用户表中获取每一列

我想我会在用户表中保留所有公共字段,然后将其他字段放在单独的表中。例如,假设我的数据库中有以下表:

Users:

- UserID (PK, Identity)
- UserName
- Password
...

UsersActivity:

- UserID (PK, FK)
- LastActivityDate
- LastLoginDate
...

UsersPreferences:

- UserID (PK, FK)
- HtmlEmail
- HideEmail
...
与下列实体合作:

public class User {
    public virtual int UserID { get; set; }
    public virtual string UserName { get; set; }
    public virtual string Password { get; set; }
    public virtual UserActivity Activity { get; set; }
    public virtual UserPreferences Preferences { get; set; }
}

public class UserActivity {
    public virtual User User { get; set; }
    public virtual DateTime LastActivityDate { get; set; }
    public virtual DateTime LastLoginDate { get; set; }
}

public class UserPreferences {
    public virtual User User { get; set; }
    public virtual bool HtmlEmail { get; set; }
    public virtual bool HideEmail { get; set; }
}
我只是想知道,为了获得最佳性能,最好的方法是什么?我想我可以对用户实体中的活动和性能属性进行一对一的映射。然而,据我所知,一对一映射不支持延迟加载,这种方法最终会变得更慢

我还研究了组件映射,不太确定是否可以将其映射到一个单独的表中(请更正是否最好将其保留在同一个表中),以及组件是否支持延迟加载

在我着手对我的应用程序进行一些重大重构之前,我想我会征求一些可能已经这样做的人的意见。非常感谢你的帮助

谢谢

编辑:我发现只要需要/约束一对一关系,就可以延迟加载。这就是我的情况。因此,我继续执行以下文章中的指示:

现在的问题是我得到了错误:


NHibernate.Id.IdentifierGenerationException:NHibernate.Id.IdentifierGenerationException:为:UserActivity生成的空Id

在NHibernate 3.0中,一对一关系支持延迟加载


我认为最好使用组件和惰性属性的组合。然后,您将能够将所有属性保留在一个表中,而不是一次加载所有属性。

您应该进行一些附加的应用程序分析,以确定出现性能问题的原因。这不太可能是由于选择列表中的列数造成的。你可能有一个好朋友


也就是说,使用轻量级对象有很多很好的理由,因此您可能需要考虑为此实现DTO(数据传输对象)。

我无法升级到版本3 atm。如果我不能让一对一的关系发挥作用,组件的想法将成为我的退路。我更新了我的问题,提供了关于一对一映射问题的更多细节。我使用的是fluent nhibernate,但xml中的等价物非常相似。nhibernate 3的最新版本似乎已经解决了我遇到的问题,我现在可以升级了。我已经用更多信息更新了我的问题。这不是一个选择n+1问题。我试图避免我的查询捕获select语句中的每个字段,因为它们并不总是需要的。我仍然非常怀疑选择每个字段是否是性能问题的根本原因。我肯定还有其他问题,但我的用户表有两个字段:传记(文本)和元描述(文本)仅显示在用户配置文件上。我不需要每次尝试访问users表时都收回这些信息。我可以延迟加载该属性,但对于每个属性,您都会在数据库中获得额外的命中率。通过将它们放在自己的表中,我可以将这些属性组合在一起。文本字段可能会有所不同,但我会分析、分析、分析,以确保您首先解决了最大的瓶颈。假设除了概要文件页面之外,用户只需要只读字段的子集,我将使用轻量级DTO。这是一个比拆分类简单得多的解决方案。我已经发布了一个后续问题,它更具体地映射了一对一的关系,您可以在这里找到。在不久的将来,我将用我的发现更新这个问题。