1

多くの日付操作を行うクエリ (Oracle 11g) に取り組んでいます。行ジェネレーターを使用して、別のテーブルの各レコードの日付範囲内の各日付を調べています。別のクエリを使用すると、行ジェネレーターで 8500 の日付を生成する必要があり、この量は毎年 365 日ずつ増加することがわかります。また、私が調べているテーブルには約 18000 レコードがあり、このテーブルは年間数千レコード増加すると予想されます。

行ジェネレーターを他のテーブルに結合して、各レコードの日付の範囲を取得するときに問題が発生します。SQLTuning Advisor は、高価なデカルト積があると言っています。これは、クエリが現在最大 8500 x 18000 レコードを生成できることを考えると理にかなっています。以下は、すべての日付ロジックなどを除いた、簡略化された形式のクエリです。

with n as (
  select level n
  from dual 
  connect by level <= 8500
 )
select t.id, t.origdate + n origdate    
from (
    select id, origdate, closeddate
    from my_table
) t
join n on origdate + n - 1 <= closeddate -- here's the problem join
order by t.id, t.origdate;

デカルト積を使用せずにこれら 2 つのテーブルを結合する別の方法はありますか?

これらの各レコードの経過時間を計算する必要があります。週末と連邦の祝日を除外して、経過時間を並べ替えることができます。また、テーブルのページネーションはサーバー側で行われるため、テーブルにロードしてクライアント側でソートすることはできません。

現在、システム内のレコードの最大経過日数は 3656 日で、平均は 560 日なので、8500 x 18000 ほど悪くはありません。しかし、それはまだ悪いです。

営業日を保存するフィールドを追加し、それを 1 回計算して経過時間を保存し、すべてのオープン レコードを毎晩更新するスケジュールされたタスクを作成することを諦めました。

4

1 に答える 1