私は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
driving_site
ヒント Alex Poole によって示唆されているように、検討/調査する興味深いソリューションになります。しかし、リモート挿入でどのように動作するかはわかりません。
ヒントが機能しない場合は、ローカル一時テーブルを使用できます。データをローカルの一時テーブルに挿入します。次にINSERT INTO tab@remote FROM temp
は適切に機能します。
リンクを介してローカルテーブルからリモートテーブルにデータを送信するときの最良の結果は、ローカル一時テーブルに保存してから、ローカル一時テーブルをリモートデータベース上のそのイメージ(別の一時テーブル)にコピーすることです。リモートデータベースから、リモートのtempからリモートの「実際の」テーブルに挿入/マージするスクリプトを実行します。リンクを介して「実際の」テーブルにアクセスしようとするたびに、パフォーマンスが低下しました。