将1组数据与涉及数据范围的另一组数据进行比较的最有效方法是什么

时间:2016-06-20 19:14:27

标签: sql oracle plsql associative-array bulk-collect

我正在努力想出最有效的方法来比较当前的生产数据和我有折叠日期范围的数据。

所以基本上我有一些生产数据,其中用户将连接到给定的计划,然后可能切换到另一个或不在计划上一个月等....

例如:

Plan A  1/1/15 - 6/30/15
Plan A  7/1/15 - 9/30/15
Plan B  10/1/15 - 10/30/15
Plan A  1/1/16  - 3/31/16

然后这些日期被折叠,在上面的情况下,返回将是3个跨度

Plan A  1/1/15 - 9/30/15
Plan B  10/1/15 - 10/30/15
Plan A  1/1/16  - 3/31/16

将生产折叠的跨度放入关联数组中,以便我可以检查它们,并根据此运行的先前过程生成的图像进行检查。

我还将当前折叠跨度的数据集加载到数组中,以便可以更快地访问它,而不是转到生产数据数组的每一行的表。这是通过创建一个与我填充的表相同的数据类型对象来完成的,然后像

那样批量收集
 SELECT plan_obj(pk, plan, effective_begin, effective_end)
   BULK COLLECT INTO customer_plan_tbl 
   FROM customer_plan
  WHERE id = P_ID;

所以在这一点上,我有2个关联数组,由成员填充和排序,以及它们的有效性。

那么比较差异和其他变化的最佳方法是什么?

到目前为止,我遍历生产数据,暂时加载另一个第三个数组,只包含来自当前折叠数据的成员数据,如:

SELECT customer_id, plan, effective_begin, effective_end
  BULK COLLECT
  INTO customer_plan_compare
  FROM TABLE(customer_plan_tbl )
 WHERE customer_id = customer_plan_tbl(indx).customer_id AND
          plan     = customer_plan_tbl(indx).plan; 
             ORDER BY effective_begin, effective_end, plan;

现在如果这个集合有0行,我知道我可以添加新记录,继续,循环遍历这个集合并将它与外部循环的当前行进行比较,如果它是相同的,那么什么都不做有差异,需要更新的东西。

这似乎为每一行做了很多开销,我只是想知道是否有更好的方法来比较基于客户及其有效数据范围的差异的集合。

另一个问题是我限制了批量收集的大小,所以如果同一个客户跨越不同的批量收集,我将不得不解决这个问题。

所以我们的目标是让这个新表与数据跨度的折叠窗口保持生产数据同步。

0 个答案:

没有答案