ORACLEのダイレクトロードインサートとは?

このQ&Aのポイント
  • ORACLEのダイレクトロードインサートは、バッチ処理において効率的なデータインサートを行う方法です。
  • 通常のインサートよりも処理速度が向上し、大量のデータインサートに適しています。
  • ただし、注意点として表領域の使用効率が悪くなる可能性があります。毎日DELETEやTRUNCATEを行うことで解決できる場合もありますが、他にも懸念すべき点があるか確認する必要があります。
回答を見る
  • ベストアンサー

【ORACLE】ダイレクトロードインサートについて

現在、バッチ処理にて毎日、 まずテーブルを空にして、 そのあとインサートを行う作業をしています。 しかし、余りにもインサートに時間がかかってしまい困っています。 (2000万レコード程) 何か方法を探しているとヒント句の/*+ APPEND */を使用する ダイレクトロードインサートというものを知りました。 大量のデータインサートのケースには従来のインサートよりも 処理速度が向上できるのではと感じました。 ただし、注意点が何点かあり、表領域の使用効率が悪いという所が気になっています。 毎日DELETE、もしくはTRUNCATEを行えば問題ないのでしょうか? また、ダイレクトインサートを使用する上で懸念すべき点が他にあれば ご教授お願い致します。

  • Oracle
  • 回答数2
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

>毎日DELETE、もしくはTRUNCATEを行えば問題ないのでしょうか? deleteでなくtruncateでないとダメ。 ダイレクトインサートは、空の表にロードするなら、最高のパフォーマンスを発揮します。 データの存在する表への追加ロードの場合は、索引の構築時間の関係で、 従来型インサート方が効率が良い場合がありますけどね。

その他の回答 (1)

  • dda167
  • ベストアンサー率76% (55/72)
回答No.2

バッチ処理ということで気になったので…… APPENDヒントは単一行INSERT(INSERT INTO ... VALUES ...)の場合、 無視されるので注意してくださいね。 INSERT INTO ... SELECT ... の形で使用することになります。

関連するQ&A

  • 大量レコードをTRUNCATEせずにすばやく削除する方法

    大量レコードをTRUNCATEせずにすばやく削除する方法 100万レコードあるテーブルのうち1万レコードを残して削除したい。TRUNCATEではWHERE句が指定できないので不可。DELETEでは遅すぎる。何かいい方法はないでしょうか? 1万レコードを一時テーブルに退避してTRUNCATE後に1万レコードをINSERTというのは無しです。1万レコードが1秒でもテーブル上から消えてはいけません。 Oracle10g

  • SQLローダーで複数のCSVファイルのデータを一つのテーブルにInsertしたい

    お世話になります、 以下のようにデータをSQLLDRでインサートしようと思っているのですが、複数のCSVファイルのデータを一つのテーブルにInsertしたい場合にどのようにすればいいか教えてください。 --バッチファイル sqlldr userid=fmwuser/fmwuser@fmw001 control=ctl/AUTHORITY.CTL log=section1.log data=csv/AUTHORITY.csv --CTLファイル LOAD DATA TRUNCATE INTO TABLE AUTHORITY FIELDS TERMINATED BY ',' ( AUTHORITYCODE ,AUTHORITYNAME,EXECUTIVE) CTLファイルでTRUNCATEを付けるとテーブルを初期化してからインサートするからむりですよね... TRUNCATEをはずすと、データが入っているテーブルに対してSQLLDRは使用できないと怒られるし... CSVファイルを一つにまとめるしかないのでしょうか?

  • SQL*LoaderとInsertの違いについて

    大量データを扱う場合、下記2通りの方法がある事を知りました。どちらが大量データの書き込み処理が早いのでしょうか? (1)SQL*Loaderのダイレクト・パス・ロード (2)insert /*+ append */ によるダイレクト・パス・インサート また、通常のINSERTと比べてどれ位時間短縮されるものか事例等ありましたら目安として教えて下さい。

  • ダイレクトパスロードの性能について

    SQL*LOADERのダイレクトパスロードで約700万件のデータをロードしたところ、約1時間20分かかり、従来型パスロードより、20分ほど長くなりました。何か考えられることはあるでしょうか。ちなみにTRUNCATE後、APPENDでロードしています。

  • TruncateしたテーブルへのInsertの遅さが気になる

    こんにちわ。 日次処理として、毎晩ワークテーブルをTruncateしてInsertしなおすというプログラムを数年前に作りました。 このプログラムはVB6、ADO、OLE DBプロバイダはOracleのものを使っています。 他のテーブルからSelectし、それを元に1レコードずつInsert文を作っては実行を繰り返す処理で正直遅いのですが、このプログラムの動作が不思議です。 日々数十万件のInsertを行っているのですが、ログを確認すると最初の2万件のInsertには40分掛かるわりに最後の2万件は5分で終わるのです。 今まで処理時間の遅さが問題になることもなく、バグもなく動いているしであまり気にしていなかったのですが、最近なぜこのような動きになるのか気になってきました。 最初も最後もSelect結果に偏りはなく、Insert文を作る処理に掛かっている時間は同じようなものかと思います。 とすると、遅いのはDBでのInsert処理か?と考えています。 レコード件数が少ないうちのInsertには時間が掛かるものなんでしょうか? だとするとそれはなぜ? 別に処理速度を速くしたいとか言うことではなく、なぜInsertの処理時間にこれほどの差が生じるのかが気になっています。 なおこのテーブルは主キー以外に索引を作っていません。 Insert文を作る際の元になるデータは論理的な単位ごとにSelectします。1回がだいたい数十件ぐらいです。 またその論理的な単位の分のデータをInsertしおわるごとにcommitしています(数十件ごとのcommitになります)。

  • delete⇒insert

    web開発の現場にて、 既存データの更新処理を行うとき、 (1)update (2)delete⇒insert というように2パターンを見かけます。 (1)と(2)の違いあるのでしょうか、 また、どのような場面においてどちらを使用したほうがいい など教えてください。

    • ベストアンサー
    • MySQL
  • SQL INSERTの使い方を教えてください

    vb2008でアクセスへデータを書き込む部分のコードを書こうとしているのですが、SQLのINSERT構文を使って連続した10レコードをテーブルへINSERTしたいのですが1つわからないところがあります。例えば、あるフィールドで、1番目のレコードだけアイテムが入り、残りは書き込む必要がない場合、Do~Loopなど使用しINSERT構文にて書き込み処理する場合、どのように条件わけするとすっきり書けるでしょうか・・・?いい感じのロジックがあればご教授願います。

  • INSERT,UPDATEしなかったレコードだけをDELETEしたい

    質問させてください、 CSV形式の10万行のデータをADO経由でINSERT,UPDATEしています そのときUPDATEもINSERTもされなかったレコードをDELETEしているんですが、 今はINSERT,UPDATE処理が終わったあと、全レコードのrecordsetを1レコードずつ csvファイルの1行と比較しています。 他に良い方法はないでしょうか? csvファイルには category, item, price postgresのテーブル名はt_zaikoとして id(INT[NOT_NULL, default_nextval, primary_key]), category(SMALL_INT), item(TEXT), price(SMALL_INT) とします。

  • BULK INSERTのエラー取得は可能なのでしょうか?

    こんばんは。 お世話になります。 SQL Server初心者です。 現在、CSVファイルに出力された他のデータベース(Paradox)のデータをSQL Server2005に移行するためのツールを作成しています。 Paradoxでは、以下のように、(1)と(2)のレコードが存在した場合、重複エラーとならなかったのですが、SQL Serverでは、当然ながら、重複エラーとなってしまいます。  (1)aaaaa, 1, あいうえお  (2)AAAAA, 1, かきくけこ  ※aaaaaとAAAAAが主キーの場合 CSVファイルのレコードは、多いもので700万件も含まれ、これを1行読み込み、既存データか否かをチェックし、既存の場合はINSERTしないという処理を700万回繰り返すと、相当な時間がかかり、性能向上を求められています。 そのため、BULK INSERTを使用する方向で検討してみました。 しかし、CSVファイルに主キー重複したレコードが存在すると、エラーが返されますが、BULK INSERTでは、どのレコードでエラーになったかまでは取得することができません。 ずいぶん、調べてみたのですが、無理のようでした。 BULK INSERTでエラーとなる箇所を特定する方法は本当にないでしょうか? もし、無理ならば、何か他にエラー箇所を特定して速くINSERTするコマンド、方法はないでしょうか? お知恵をお借りしたく、よろしくお願いいたします。

  • Sybase IQでのINSERT速度改善

    リアルタイムにデータが発生し、Sybase IQ(15.2)のテーブルに随時レコード追加する処理のパフォーマンス改善をしたいです。 Javaでプログラムを書いていて、1スレッドで処理をしていたのですが、レコード総数が多くなってきたせいか処理が重くなってきました。 ですので複数スレッド・コネクションでINSERT文を実行するように修正したところ、以下のエラーが発生しました。 「SQL Anywhere エラー -210 : テーブル名 のローは、ユーザ '別のユーザ' によってロックされています。」 INSERTしているだけなのですが、テーブル全体をロックしているのかエラーが発生してしまいます。 数十件くらいのINSERT文をバッチ処理(executeBatch)で実行するということを、各スレッドで数秒間隔で行っています。UPDATEは一切行いません。 Sybase IQで、複数のコネクションで並列してINSERT文を実行するということはできないのでしょうか? また他に改善方法がありましたら教えてください。