そのため、非常に大きなテーブルをいくつかクエリしています。これらが非常に大きい理由は、既存のレコードを更新するのではなく、一部のデータに変更が加えられるたびに、PeopleSoft が新しいレコードを挿入するためです。実際、そのトランザクション テーブルはデータ ウェアハウスでもあります。
これにより、最新/現在の行を取得するために、選択がネストされたクエリが必要になります。それらは両方とも有効な日付であり、各日付 (日にキャスト) 内で有効なシーケンスを持つことができます。したがって、 の現在のレコードを取得するには、次のようにするuser_id=123
必要があります。
select * from sometable st
where st.user_id = 123
and st.effective_date = (select max(sti.effective_date)
from sometable sti where sti.user_id = st.user_id)
and st.effective_sequence = (select max(sti.effective_sequence)
from sometable sti where sti.user_id = st.user_id
and sti.effective_date = st.effective_date)
これらのテーブルには驚異的な数のインデックスがあり、クエリを高速化するものは他に見つかりません。
私の問題は、おそらく 50 個の user_id について、これらのテーブルから個人に関するデータを取得したいことがよくありますが、レコードが数個しかないテーブルをこれらの PeopleSoft テーブルのいくつかと結合すると、うまくいかないことです。
PeopleSoft テーブルは、データベース リンクを介してアクセスするリモート データベース上にあります。私のクエリは次のようになります。
select st.* from local_table lt, sometable@remotedb st
where lt.user_id in ('123', '456', '789')
and lt.user_id = st.user_id
and st.effective_date = (select max(sti.effective_date)
from sometable@remotedb sti where sti.user_id = st.user_id)
and st.effective_sequence = (select max(sti.effective_sequence)
from sometable@remotedb sti where sti.user_id = st.user_id
and sti.effective_date = st.effective_date)
複数の PeopleSoft テーブルをローカル テーブルに結合する必要があると、事態はさらに悪化します。パフォーマンスは受け入れられません。
パフォーマンスを向上させるためにできることは何ですか? ローカル テーブルが最初に PeopleSoft のパートナーに結合されるようにクエリ ヒントを試しました。そのため、正しい user_id に絞り込む前にすべてのテーブルを結合しようとしません。私はLEADING
ヒントを試し、処理をリモートデータベースにプッシュしようとするヒントをいじりましたが、説明計画がわかりにくく、いくつかの操作で「REMOTE」とだけ言われ、何が起こっているのかわかりませんでした。
PeopleSoft とテーブルの場所を変更する権限がないと仮定すると、ヒントは最良の選択でしょうか? ローカル テーブルを 4 つのリモート テーブルと結合していて、ローカル テーブルがそのうちの 2 つと結合している場合、ローカル テーブル (非常に小さい - 実際、インライン ビューを実行するだけでよい) になるようにヒントをフォーマットするにはどうすればよいでしょうか。ローカルテーブルを興味のある user_ids だけにするために) 最初に各リモートテーブルと結合しますか?
編集:アプリケーションはリアルタイム データを必要とするため、残念ながらマテリアライズド ビューやその他のデータ キャッシュ方法では十分ではありません。