0

現在の本番データを、日付範囲を折りたたんだデータと比較する最も効率的な方法を考え出そうとしています。

したがって、基本的に、ユーザーが特定のプランに接続されてから、別のプランに切り替えたり、1か月間プランに含まれていない可能性のある実稼働データがあります....

例えば:

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 つの連想配列が埋められ、メンバーとその有効性によって並べ替えられています。

では、相違点やその他の変更点を比較するにはどうすればよいでしょうか?

これまでのところ、本番データをループして、別の 3 番目の配列を一時的にロードし、次のような現在の折りたたまれたデータからそのメンバー データだけを読み込みます。

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行がある場合、新しいレコードを追加して、次に進み、このコレクションをループして、外側のループの現在の行と比較できることを知っています。同じであれば、何もする必要はありません。 、物事を更新する必要があります。

これは、各行に対して行うオーバーヘッドが大きいように思えます。私は、顧客とその有効なデータのスパンに基づいて違いをコレクションと比較するためのより良い方法があるかどうか疑問に思っていました.

もう 1 つの問題は、一括収集のサイズを制限しているため、同じ顧客が異なる一括収集にまたがっている場合は、それを解決する必要があることです。

したがって、目標は、データ スパンの折りたたまれたウィンドウだけで、この新しいテーブルを運用データと同期させることです。

4

0 に答える 0