nhibernate - 归档记录

时间:2011-10-11 01:05:23

标签: performance nhibernate archiving

这是我们的域模型(我们在医疗保健中)的简单视图:

Account
{
  List<Registration> Registrations {...}
  DateTime CreatedDate {...}
  Type1 Property1 {...}
  Type2 Property2 {...}
  ...

 }

Registration
{
 InsuranceInformation {...}
 PatientVisit {...}
 Type1 Property1 {...}
 Type2 Property2 {...}
 ...

 } 

设置

  1. 我们使用Nhibernate / FluentNH来设置和配置SessionFactory
  2. 我们假设我们已经设置了所有必需的表索引
  3. 用法

    1. 我们每天获得约10,000个新帐户
    2. 我们有大约500K账户总数。
    3. 我们有几个以这些帐户运营的Linq查询
    4. 我们所有的查询都使用Linq,大多数查询是使用谓词构建器模式动态构建的(我们不使用Hql)
    5. 问题是, 随着帐户数量的增加,这些查询的执行时间也会增加。

      注意:

      1. 只有48小时内的帐户才有效 我们的查询/申请。但是,需要保留较旧的帐户 (所以不能删除)。即使不需要这些帐户 应用程序可能稍后由分析使用 应用
      2. 解决此性能问题:

        1. 我们正在考虑存档超过48小时的帐户
        2. 使用与主db相同的模式创建存档数据库
        3. 添加计划在每晚基本运行的Windows服务,将“旧”帐户从主数据库移动到存档数据库
        4. Windows服务将使用nhiberate从主数据库中读取旧帐户并将旧帐户(再次使用nhibernate)保存到存档数据库,然后从主数据库中删除旧帐户。现在,我们认为此服务将一次移动一个帐户,直到所有旧帐户都移动到存档数据库。
        5. 偶尔,当我们收到从归档数据库恢复帐户的请求时,我们将撤销上述步骤
        6. 问题:

          1. 这种档案方式有什么好处吗?如果没有,为什么?你能建议吗? 一些替代实施?
          2. 我可以在复制过程中使用相同的sessionfactory连接到主数据库和存档数据库吗?如何动态更改连接字符串?我可以使用两个模拟开放会话,使用两个数据库
          3. 我可以使用这种方法一次复制多个帐户吗?批量复制和批量删除?
          4. 感谢任何帮助,感谢您的投入。

1 个答案:

答案 0 :(得分:1)

我认为您的问题与nhibernate相关的数据库更多。拥有500k记录的数据库并不是那么多。要优化访问权限,您应该考虑如何查询以及如何针对这些查询进行优化。

  1. 仅查询您需要的数据
  2. 通过制作索引来优化您的表格
  3. 使用20/80规则,找到20%的昂贵查询并优化代码/查询。你的程序将快80%
  4. NHibernate:优化您的映射
  5. HHibernate:如果进行多次更新,则使用批量大小
  6. 如果在代码中很难做到,则添加存储过程
  7. 如果您的数据库增长,请聘请数据库专家来建议数据库优化(他们可以将您的性能提高10%到90%)。你首先需要他几天,然后每周/每月需要一次,具体取决于工作量。