1

私は 1 億 4000 万行以上を含む非常に大きなテーブルをオラクルに持っています。現在、このテーブルで毎晩 3 回のフル テーブル スキャンを実行しており、結果の一部を使用して tmp テーブルにデータを入力しています。その tmp テーブルは、非常に大きなレポート (通常は 140K + 行) に変換されます。

大きなテーブルは tasklog と呼ばれ、次の構造があります。

何百万もの異なるドキュメント ID があり、それぞれが 1 回から数百回繰り返されます。date_time_in は、このエントリがデータベースに追加された時刻です。

すべてのフル テーブル スキャンは次のようになります。

DECLARE
n_prevdocid     number;

cursor tasks is
   select * 
   from tasklog
   order by document_id, date_time_in DESC;

BEGIN

for tk in tasks
loop
    if n_prevdocid <> tk.document_id then
         -- *code snipped*

    end if;
    n_prevdocid = tk.document_id;
end loop;

END;
/

だから私の質問: 最新の date_time_in を持つ行で document_ids の個別のリストを取得する簡単な (ish) 方法はありますか? これにより、全体が劇的に高速化される可能性があります。または、このデータを毎日取得するためのより良い方法を考えられる人はいますか?

関連する可能性があること、このテーブルには現在の日時で挿入された行しかありません。範囲分割されていませんが、それがどのように役立つかわかりません。行が更新または削除されることはありません。毎日約 70k ~ 80k 行が挿入されます。

4

3 に答える 3

1

少なくとも 1 回は完全なテーブル スキャンを実行することから逃れることはないと思います。それが効率的である唯一の方法は、個別の document_id と合計レコードの比率がかなり小さい場合です。データが生成および挿入される方法が原因で、document_id のクラスタリングは非常に貧弱になります。

どうですか:

create table tmp nologging compress -- or pctfree 0
as
select ...
from   (
  select t.*,
         max(date_time_in) over (partition by document_id) max_date_time_in
  from   tasklog t)
where   date_time_in = max_date_time_in

おそらく、これを一度作成すると、新しいレコードのみをこのセットにマージすることで、その後の更新を最適化できます。何かのようなもの ...

merge into tmp
using (
  select ...
  from   (
    select t.*,
           max(date_time_in) over (partition by document_id) max_date_time_in
    from   tasklog t
    where  date_time_in > (select max(date_time_in) from tmp))
  where   date_time_in = max_date_time_in)
on ... blah blah
于 2012-12-12T09:25:56.857 に答える
0

あなたはこのようなことをすることができます:

select document_id , date_time from tasklog group by date_time,document_id order by date_time desc;

distinct document_idこれにより、最新の列で取得できますdate_time

于 2012-12-12T07:08:39.370 に答える
0

やってみました:

select document_id
from tasklog t1
where date_time_in = (select max(date_time_in)
                      from tasklog t2
                      where t1.document_id=t2.document_id)
于 2012-12-12T06:39:22.203 に答える