如何评估大量数据库记录的条件
How to evaluate a condition on a large number of database records
我在 Entity Framework CodeFirst 中有一个数据模型。该数据模型包含一个 Contracts 实体,SQL 服务器中存在大约一百万条记录。合同实体与其他实体直接或间接相关。
我现在有一个后端作业需要检查所有合同的条件,如果该条件评估为真,它必须对合同执行一些操作。问题是条件不是那么简单,可以放在某个 where 子句中。它对合同的评估要求我们检查合同层次结构中几个对象的状态。对于数据库中合同总数的一小部分,条件评估为真。
这意味着我只需要在内存中加载少量合同,但要确定哪些合同,我需要评估所有合同,所以如果我不想评估数据库中的条件(比如在存储过程中),貌似我需要加载内存中的所有Contracts。
因此,似乎有 2 个非常次优的解决方案:
1) 在存储过程中确定满足条件的合同的合同 ID,然后从代码中仅获取这些合同。这意味着我们将逻辑放在我们的数据库中,这似乎违背了代码优先的整个哲学。
2) 获取所有内存中的合约(一部分一部分,例如在 500 个样本中)并在代码中评估条件。这当然在性能方面不是很好。
我的问题是,有哪些替代方法可以解决这个问题?
对于给定的classComplexClass
有对应的ComplexClassInfo
。信息 class 包含 ComplexClass
的 key/important 属性。它通常也有子对象的成员。我们添加了足够多的属性来为 Info classes 提供一些一般用途。 IE。我们没有为特定数据查询量身定制的信息 classes。
为 ComplexClassInfo
数据执行初始数据库提取,这可能会被过滤。然后应用我们的复杂规则迭代该 ComplexClassInfo 集合。使用结果集,我们查询数据库以实例化单个 ComplexClass
个对象。
我对这两种方法的看法如下:
- 是的,与代码相比,存储过程中的复杂逻辑更难维护。但这并不意味着你不这样做。如果性能对你来说很重要,那就是你应该做的。
- 您在获取和处理 500K 行上花费了多少时间?你应该能够优化它。考虑 -
一种。您正在获取的列数。你能在那里优化吗?
b.您可以使用的最大提取大小是多少?您可以将获取大小设置为 500K 吗?
C。您可以在代码中优化什么?内存参数?更快的算法?
我在 Entity Framework CodeFirst 中有一个数据模型。该数据模型包含一个 Contracts 实体,SQL 服务器中存在大约一百万条记录。合同实体与其他实体直接或间接相关。
我现在有一个后端作业需要检查所有合同的条件,如果该条件评估为真,它必须对合同执行一些操作。问题是条件不是那么简单,可以放在某个 where 子句中。它对合同的评估要求我们检查合同层次结构中几个对象的状态。对于数据库中合同总数的一小部分,条件评估为真。
这意味着我只需要在内存中加载少量合同,但要确定哪些合同,我需要评估所有合同,所以如果我不想评估数据库中的条件(比如在存储过程中),貌似我需要加载内存中的所有Contracts。
因此,似乎有 2 个非常次优的解决方案: 1) 在存储过程中确定满足条件的合同的合同 ID,然后从代码中仅获取这些合同。这意味着我们将逻辑放在我们的数据库中,这似乎违背了代码优先的整个哲学。 2) 获取所有内存中的合约(一部分一部分,例如在 500 个样本中)并在代码中评估条件。这当然在性能方面不是很好。
我的问题是,有哪些替代方法可以解决这个问题?
对于给定的classComplexClass
有对应的ComplexClassInfo
。信息 class 包含 ComplexClass
的 key/important 属性。它通常也有子对象的成员。我们添加了足够多的属性来为 Info classes 提供一些一般用途。 IE。我们没有为特定数据查询量身定制的信息 classes。
为 ComplexClassInfo
数据执行初始数据库提取,这可能会被过滤。然后应用我们的复杂规则迭代该 ComplexClassInfo 集合。使用结果集,我们查询数据库以实例化单个 ComplexClass
个对象。
我对这两种方法的看法如下:
- 是的,与代码相比,存储过程中的复杂逻辑更难维护。但这并不意味着你不这样做。如果性能对你来说很重要,那就是你应该做的。
- 您在获取和处理 500K 行上花费了多少时间?你应该能够优化它。考虑 - 一种。您正在获取的列数。你能在那里优化吗? b.您可以使用的最大提取大小是多少?您可以将获取大小设置为 500K 吗? C。您可以在代码中优化什么?内存参数?更快的算法?