1

UserTable、UserTablebBackUp、および UserBlackList の 3 つのテーブルがあります。各テーブルには約 35M のデータがあります。

各タプルを UserTable から UserTablebBackUp に移行したいのですが、全体は UserBlackList にありません。以下のようにスクリプトを作成しました。このスクリプトを最適化する方法はありますか? そうでなければ、それは最高のものですか?ありがとう。

insert /*+APPEND+*/ INTO UserTablebBackUp (id_backup) select id from UserTable 
        where id not IN (SELECT id from UserBlackList);
4

2 に答える 2

1
insert /*+APPEND+*/ INTO UserTablebBackUp(id_backup) select a.id from usertable a
left outer join userblacklist b on a.id=b.id where b.id is null 

それはより速いはずです...

于 2013-09-04T14:12:37.363 に答える
0

並列処理 3,500 万行の場合、おそらく並列実行 の恩恵を受けることができます。ただし、Enterprise Edition、並列設定、適切なハードウェア構成、十分なリソースなど、多くの要件があります。

11gR2 を使用している場合は、次のように簡単です。

insert /*+ APPEND PARALLEL*/
INTO UserTablebBackUp (id_backup) select id from UserTable 
where id not IN (SELECT id from UserBlackList);

ダイレクト パス書き込みおそらく既にこれを取得しているでしょうが、再確認する価値があります。
APPEND ヒントだけでは必ずしも十分ではありません。ダイレクト パス書き込みには多くの制限があります。ダイレクト パス挿入を使用している場合はLOAD AS SELECT、実行計画にLOAD TABLE CONVENTIONAL. それでも従来型の挿入が行われる場合は、いくつかの制限について SQL 言語リファレンスを参照し、nologging 設定のこの便利なマトリックスを参照してください。

このような単純なクエリであっても、常に説明計画を投稿する必要があります。

于 2013-09-04T18:24:31.080 に答える