質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.34%
INSERT

INSERTとは、行を追加する、コンピュータのデータベース言語SQLにおけるデータ操作言語(DML)ステートメントの1つである

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

1回答

161閲覧

sqlplusのcopyコマンドのinsert句の処理速度について

hashirou

総合スコア3

INSERT

INSERTとは、行を追加する、コンピュータのデータベース言語SQLにおけるデータ操作言語(DML)ステートメントの1つである

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2024/12/10 02:23

Oracleでテーブルを丸ごとコピーしたいと考えてます。
sqlplusのcopyコマンドのinsert句を使用すると、単にinsert文で「insert into テーブルA select * from テーブルB」でコピーするよりも処理速度は速くなるのでしょうか?
replace句を使用すると速くなることは認識しているのですが、replace句だとコピー先のテーブルを一度削除することになり、削除前のキーの設定などが引き継がれないと思うので、使用を避けたいと思っています。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

質問の内容からは処理時間を一番に考えておられて、現在遅いと感じられている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:19

sazi

総合スコア25331

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2024/12/10 06:27

一般的にCOPYコマンドによる外部データの取込の場合、不正なデータを取込まないよう、一旦ワークなどに取り込んで精査した後に反映を行うようにすべきです。 やりたいことが、単に履歴やバックアップの生成なら、SQLコマンドによる実施の方が良いと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.34%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問