拆分表以提高性能

时间:2011-01-11 10:13:50

标签: nhibernate

我的用户在数据库中的表变得越来越大(就列而言不是行),因此减慢了我站点的各个区域。这是因为每次对用户进行连接时,它都会尝试从用户表中抓取每一列。

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

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; }
}

我只是想知道映射这个以获得最佳性能的最佳方法是什么?我想我可以在User实体的Activity和Performance属性上做一对一的映射。但据我所知,一对一映射不支持延迟加载,这种方法最终会变慢。

我也查看了组件映射,并且不太确定我是否可以将它映射到一个单独的表中(如果最好将它保存在同一个表中,请更正我)以及组件是否支持延迟加载。

在我对我的应用程序进行一些重度重构之前,我想我会得到可能已经做过这个的人的意见。真的很感激帮助。

由于

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

http://brunoreis.com/tech/fluent-nhibernate-hasone-how-implement-one-to-one-relationship/

现在的麻烦是我得到了错误:

NHibernate.Id.IdentifierGenerationException:NHibernate.Id.IdentifierGenerationException:为以下项生成的null id:UserActivity。

2 个答案:

答案 0 :(得分:0)

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

我认为最好将Component与Lazy属性结合使用。然后,您将能够将所有属性保留在一个表中,而不是一次性加载它们。

答案 1 :(得分:0)

您应该进行一些额外的应用程序分析,以确定您遇到性能问题的原因。它不太可能是由于选择列表中的列数。你可能有一个N+1 select problem

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