web-dev-qa-db-ja.com

Oracleのdblinkによる挿入のパフォーマンスの問題

私はdblinkを介してテーブルへの選択として挿入を実行しようとしています。クエリは次のようになります。

    Insert into MARS_SUPERVISORS_PUB@EDHPUB
     select 
        {...}
     from edhper a, edhper b
     where {...
              a.idn not in (select s.tarcfsra idn from cfsra s where s.srtcfsra = 'MAPSSPA' and s.stscfsra = 'A')
           ...}

選択自体はここで非常に高速に動作します。その実行プランにはすべての結合が表示されますが、挿入には非常に時間がかかり、プランは「REMOTE」ステップのみで構成されています。

INSERT STATEMENT REMOTE, GOAL = ALL_ROWS
 LOAD TABLE CONVENTIONAL
  SORT AGGREGATE
   FILTER
    REMOTE
    REMOTE
  FILTER
   HASH JOIN
    REMOTE
    REMOTE
   REMOTE

Oracleがデータベースリンクを通じてテーブルaとbの両方をプッシュしてから、そこに結合しようとしているのでしょうか。現在のDB内で選択を行い、結果のみを@EDHPUBに渡すようにオプティマイザに指示できますか?

P.S /

ローカルでテストテーブルを作成する場合、これを選択して挿入し、次のような挿入を行います。

Insert into MARS_SUPERVISORS_PUB@EDHPUB
select * from TEMP_TBL

それは速く動作します。私にとっては、前の例では、Oracleが本当にdblinkを介して結合されていないテーブルをプッシュしようとしているという証拠のようです。

PDATE /a a.idn not in ...条件が原因で挿入に時間がかかることがわかりました。これがないと、計画は次のようになります。

INSERT STATEMENT REMOTE, GOAL = ALL_ROWS
 LOAD TABLE CONVENTIONAL
  SORT AGGREGATE
   FILTER
    REMOTE
    REMOTE
  HASH JOIN
   REMOTE
   REMOTE
3
andreybavt

driving_site ヒント Alex Poole によって示唆されているように、検討/調査する興味深いソリューションになります。しかし、リモート挿入でどのように動作するかはわかりません。

ヒントが機能しない場合は、ローカル一時テーブルを使用できます。データをローカルの一時テーブルに挿入します。次にINSERT INTO tab@remote FROM tempは適切に機能します。

2
Vincent Malgrat

リンクを介してローカルテーブルからリモートテーブルにデータを送信するときの最良の結果は、ローカル一時テーブルに保存してから、ローカル一時テーブルをリモートデータベース上のそのイメージ(別の一時テーブル)にコピーすることです。リモートデータベースから、リモートのtempからリモートの「実際の」テーブルに挿入/マージするスクリプトを実行します。リンクを介して「実際の」テーブルにアクセスしようとするたびに、パフォーマンスが低下しました。

1
Harris