如何评估大量数据库记录的条件

时间:2015-12-31 15:59:20

标签: sql-server performance entity-framework architecture code-design

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

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

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

因此,似乎有两个非常不理想的解决方案: 1)确定符合存储过程条件的合同的合同ID,然后从代码中仅获取这些合同。这意味着我们将逻辑放在我们的数据库中,这似乎首先违背了整个代码哲学。 2)在内存中获取所有合同(逐个部分,例如在500个样本中),并在代码中评估条件。这当然是表现明智不太好。

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

2 个答案:

答案 0 :(得分:1)

对于给定的班级ComplexClass,我们会有相应的ComplexClassInfo。 Info类包含ComplexClass的关键/重要属性。它通常也有子对象的成员。我们提供了足够的属性来为Info类提供一些通用的功能。 I.E.我们没有为特定数据查询量身定制的信息类。

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

答案 1 :(得分:0)

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

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