【问题标题】:Entity framework with lots of rows具有大量行的实体框架
【发布时间】:2012-06-27 15:03:12
【问题描述】:

我正在开发一种医疗软件,我的目标是将大量自定义操作存储到数据库中。由于跟踪谁做了什么非常重要,所以每次用户做一些有意义的事情(例如写评论、添加一些医疗信息等)时都会产生一个动作。现在的问题是,随着时间的推移会有很多个动作,假设每个患者有 10000 个,可能有 50000 个患者,总共有 5 亿个动作(甚至更多)。

目前的数据库模型是这样的:

[Patient] 1 -- 1 [ActionBlob]

所以每个患者都只有一个大 blob,其中包含所有操作作为大序列化字节数组。当然,当表变大时,这将不起作用,因为我必须一直在数据库和客户端之间来回传输整个字节数组。

我的下一个想法是列出单独序列化的操作(不是大块),即

[Patient] 1 -- * [Action]

但我开始怀疑这是否是一个好方法。现在,当我添加新动作时,我不必序列化所有其他动作并将它们传输到数据库,而只需序列化一个动作并将其添加到 Actions 表中。但是加载数据怎么样,一张表可能有5亿行,会不会很慢?

所以基本上问题是:

  1. sql server 能否处理从 5 亿行的表中加载 10000 行? (这些数字可能更大)
  2. 实体框架能否处理 10000 个实体的具体化而不会很慢?

【问题讨论】:

  • 分区表应该满足您的需求

标签: sql-server entity-framework


【解决方案1】:

您的第二个想法是正确的,对于 SQL 数据库来说,拥有较小的百万项是没有问题的,而且如果您在操作表中索引一些有用的列,它将导致更快的性能。

将操作存储为 blob 是一个非常糟糕的主意,因为每次您都必须从 blob 转换为单个记录以进行搜索,并且它不会提供搜索等任何好处。

正确索引的十亿条记录对于 SQL Server 来说根本不是问题。

而且在任何用户界面中,我们都会一次看到百万条记录,我们总是会分页记录,例如 1 到 99、100 到 199 等等。

我们有近 1000 万行的表,但一切都很顺利,因为经常搜索的列被索引,外键被索引。

【讨论】:

    【解决方案2】:

    问题 1 和 2 的简答:是。

    但是,如果您要一次性完成这些“物化”,您宁愿使用 SqlBulkCopy。 我建议你看看以下内容:

    关于您的模型,您绝对不应该使用 blob 来存储操作。有一个包含 Patient 外键的 Action 表,并确保在该表中有一个时间戳列。 这样,当您必须为给定患者加载操作时,您可以使用时间作为过滤条件(例如,加载过去 2 个月的操作)。

    由于您可能要获取给定 Patient 的 Actions,请确保将 Patient FK 设置为索引。

    希望这会有所帮助。

    问候, 卡利尔

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-16
      • 1970-01-01
      • 2012-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多