【问题标题】:How to evaluate a condition on a large number of database records如何评估大量数据库记录的条件
【发布时间】:2021-12-02 06:23:51
【问题描述】:

我在 Entity Framework CodeFirst 中有一个数据模型。此数据模型包含一个 Contracts 实体,其中 SQL Server 中存在大约 50 万条记录。合同实体与其他实体直接或间接相关。

我现在有一个后端作业需要检查所有合同的条件,如果该条件评估为真,它必须对合同执行一些操作。问题是条件不是那么简单,可以放在某个 where 子句中。对合约的评估要求我们检查合约层次结构中几个对象的状态。对于数据库中合同总数的一小部分,条件评估为真。

这意味着我只需要在内存中加载少量合同,但要确定哪些合同,我需要评估所有合同,所以如果我不想评估数据库中的条件(对于例如,在存储过程中),似乎我需要将所有合同加载到内存中。

所以,似乎有 2 个非常次优的解决方案: 1)在存储过程中确定满足条件的合约的合约ID,然后从代码中仅获取这些合约。这意味着我们将逻辑放在我们的数据库中,这似乎首先违背了整个代码哲学。 2)在内存中获取所有合约(部分地,例如在500个样本中)并在代码中评估条件。这当然在性能方面不是很好。

我的问题是,有哪些替代方法可以解决这个问题?

【问题讨论】:

  • 如果你把选择合约的规则放在这里,也许我们可以写一个你可以使用的linq查询。
  • 我们无法为您做出此决定。我不确定你到底在问什么。

标签: sql-server performance entity-framework architecture


【解决方案1】:

对于给定的类ComplexClass,有一个对应的ComplexClassInfo。 Info 类包含ComplexClass 的关键/重要属性。它通常也有子对象的成员。我们添加了足够多的属性来为 Info 类提供一些一般用途。 IE。我们没有为特定数据查询量身定制的 Info 类。

ComplexClassInfo 数据执行初始数据库提取,可能会被过滤。然后应用我们的复杂规则迭代该 ComplexClassInfo 集合。使用结果集,我们查询数据库以实例化各个 ComplexClass 对象。

【讨论】:

  • 受您的回答启发,我编写了一个 linq 查询(相当复杂但仍然易于管理)以获取每个合约的最少信息量,以便能够测试条件。获取所有行大约需要一分钟,其余的处理时间要少得多。所以整个过程之前大约需要 15 分钟,现在只需 2 分钟左右。
【解决方案2】:

我对这两种方法的想法如下:

  1. 是的,与代码相比,存储过程中的复杂逻辑更难维护。但这并不意味着你不这样做。如果性能对您很重要,那么您应该这样做。
  2. 您在获取和处理 500K 行上花费了多少时间?你应该能够优化它。考虑 - 一个。您正在获取的列数。你能在那里优化吗? 湾。您可以使用的最大获取大小是多少?你可以设置 500K 的提取大小吗? C。你可以在代码中优化什么?内存参数?更快的算法?

【讨论】:

    猜你喜欢
    • 2020-09-22
    • 2011-06-16
    • 2019-10-17
    • 1970-01-01
    • 1970-01-01
    • 2019-05-31
    • 1970-01-01
    • 2018-10-04
    • 2021-10-25
    相关资源
    最近更新 更多