2017.08.08 システム
[データベース] Oracle|ダイレクトロードインサートを活用してみよう!!
データベースエンジニアのオーハシです。やっと「夏らしく」なりましたが、皆さんはいかがお過ごしでしょうか!?
今回は「Oracleテクニック」をお伝えします。パート1として「ダイレクトロードインサート」による「データ挿入方法」を共有しますので、是非、活用してみてください。
大量データのインサート!?
例えば、旧テーブルから新テーブルへ大量データを移行することを想定してみてください。数百万レコードもの大量データをインサートする場合、どのように行っていますか!?
単純に考えれば、以下のSQLを実行すれば良いのですが、実際に実行すれば分かることですが、恐らくは「数時間」待っても終わらないと思います。
INSERT INTO 新テーブル SELECT * FROM 旧テーブル;
通常のインサート処理では「バッファキャッシュ」と呼ばれる「システム領域」を経由して「REDO情報」が書き込まれます。「REDO情報」とは「実行履歴」のようなものであり、コミット処理やロールバック処理に使用されるものです。
つまりは、データベースへの書き込みや書き込みキャンセルに必要不可欠なとっても重要な情報ということになります。数百万レコードもの大量データをインサートすることになれば「REDO情報」への書き込みも大量ということになり、当然、とっても時間がかかることになる訳ですね。
「ヒント句」を活用しよう!!
旧テーブルから新テーブルへの大量データ移行ということに限れば、データベースへの書き込みや書き込みキャンセルを気にすることはありません。失敗しても新テーブルを作り直せば良いので。
そこで「バッファキャッシュ」を経由せず「REDO情報」へ書き込みされない方法があれば良いと思いませんか!?そんなときは「ヒント句」を活用しましょう!!
INSERT /*+ APPEND */ INTO 新テーブル SELECT * FROM 旧テーブル;
「/*+ APPEND */」というコメント句が「ヒント句」と呼ばれるチューニング技法で、ダイレクトロードインサートするための呪文のようなものになります。これだけで、ビックリするくらい高速になるはずです。是非、試してみてください。
前提条件を忘れずに!!
この「/*+ APPEND */」句ですが、当然ながら万能ではありません。いくつかの前提条件や注意点がありますので、ここを踏まえて無理なく活用しましょう!!
1. REDO情報が書き込まれないので、コミット処理やロールバック処理等のトランザクションを制御することができません。 2. 実行すると「テーブルロック」がかかってしまいます。 3. ハイウォーターマーク以降からインサート処理が実行されますので、通常インサートよりデータベース使用効率が下がります。
要するに「旧テーブルから新テーブルへの大量データ移行」等に活用するべきものということです。だた、その恩恵はとても大きいので、是非、取り組んでみてください。<つづく>