3

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

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

 }

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

 } 

设置

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

用法

  1. 我们每天获得约 10,000 个新帐户
  2. 我们总共有大约 50 万个帐户。
  3. 我们有几个在这些帐户上运行的 Linq 查询
  4. 我们所有的查询都使用 Linq,大多数查询都是使用谓词构建器模式动态构建的(我们不使用 Hql)

问题是, 随着帐户数量的增加,这些查询的执行时间也会增加。

笔记:

  1. 只有在 48 小时窗口内的帐户才与我们的查询/申请相关。但是,需要保留旧帐户(因此无法删除)。尽管应用程序不需要这些帐户,但分析应用程序稍后可能会使用这些帐户

要解决此性能问题:

  1. 我们正在考虑归档超过 48 小时的帐户
  2. 创建与主数据库具有相同架构的存档数据库
  3. 添加计划在夜间基础上运行的 Windows 服务,将“旧”帐户从主数据库移动到存档数据库
  4. Windows 服务将使用 nhiberate 从主数据库中读取旧帐户并将旧帐户(再次使用 nhibernate)保存到存档数据库,然后从主数据库中删除旧帐户。目前,我们认为这项服务将一次移动一个帐户,直到所有旧帐户都移至存档数据库。
  5. 有时,当我们收到从存档数据库恢复帐户的请求时,我们将反转上述步骤

问题:

  1. 这种归档方法有用吗?如果不是,为什么?你能建议一些替代的实现吗?
  2. 我可以在复制过程中使用同一个 sessionfactory 连接到主数据库和存档数据库吗?如何动态更改连接字符串?我可以有两个使用两个数据库的模拟打开会话吗
  3. 我可以使用这种方法一次复制多个帐户吗?批量复制和批量删除?

任何帮助表示赞赏,感谢您的意见。

4

1 回答 1

1

我认为您的问题与数据库有关,然后是休眠。拥有 50 万条记录的数据库并没有那么多。要优化访问,您应该考虑如何查询以及如何针对这些查询进行优化。

  1. 只查询你需要的数据
  2. 通过创建索引来优化你的表
  3. 使用 20/80 规则,找到 20% 昂贵的查询并优化代码/查询。您的程序将快 80%
  4. NHibernate:优化你的映射
  5. HHibernate:如果您进行多次更新,请使用批量大小
  6. 如果在代码中难以执行某些操作,请添加存储过程

如果您的数据库增长,请聘请数据库专家就数据库优化提供建议(他们可以将您的性能提高 10% 到 90%)。您首先需要他几天,然后每周/每月一次,具体取决于工作量。

于 2011-10-11T10:21:49.140 回答