質問の内容からは処理時間を一番に考えておられて、現在遅いと感じられているCOPYコマンドの扱いについてだと思います
B SQL*PlusのCOPYコマンド
上記リファレンスによると、
ノート:一般に、COPYコマンドは、Oracle DatabaseとOracle以外のデータベースの間でデータをコピーするために使用するように設計されています。Oracle Database間でデータをコピーするには、SQLコマンド(CREATE TABLE ASおよびINSERT)を使用してください。
とありますので、COPYコマンドには通常のSQLコマンドより余分な処理が含まれている事は考えられるので、COPYコマンドよりSQLコマンドの方が高速だと思われます。但し、実測するのが確実ですけど。
ただ、下記の様な課題もあるようですので、SQLコマンドで行う方がよろしいのではないかと思います。
replace句を使用すると速くなることは認識しているのですが、replace句だとコピー先のテーブルを一度削除することになり、削除前のキーの設定などが引き継がれないと思うので、使用を避けたいと思っています。
前述のリファレンスによると、目的に応じるのはAPPENDですが、キー重複の場合はエラーになるのでは無いかと思います。
B.2.2 宛先の表の扱いを制御する方法について
宛先の表の扱いを制御するには、REPLACE、CREATE、INSERTまたはAPPENDの4つの制御句のいずれかを入力します。
REPLACE句は、宛先のデータベース内に作成する表の名前を指定し、次のアクションを指定します。
・宛先の表がすでに存在する場合、COPYは既存の表を削除し、コピーされたデータが入った表に置き換えます。
・宛先の表が存在しない場合、COPYはコピーされたデータを使用してその表を作成します。
既存の表を誤って上書きしないように、CREATE句を使用することができます。CREATEは、次のアクションを指定します。
・宛先の表がすでに存在する場合、COPYはエラーを報告して停止します。
・宛先の表が存在しない場合、COPYはコピーされたデータを使用してその表を作成します。
既存の表にデータを挿入するには、INSERTを使用します。INSERTは、次のアクションを指定します。
・宛先の表がすでに存在する場合、COPYはコピーされたデータを宛先の表に挿入します。
・宛先の表が存在しない場合、COPYはエラーを報告して停止します。
既存の表にデータを挿入する場合、または宛先の表が存在しないときに新しい表を作成する場合は、APPENDを使用します。APPENDは、次のアクションを指定します。
・宛先の表がすでに存在する場合、COPYはコピーされたデータを宛先の表に挿入します。
・表が存在しない場合、COPYは表を作成し、コピーされたデータをその表に挿入します。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2024/12/10 06:27