Oracleへのデータ投入 [データベース]
Oracleに大量のデータ投入で試行錯誤してようやく満足できる形になりました。
データ数
20万件/時間
1ファイル20MB程度。
現在
6,000万件以上のレコードあり。
しばらくの間削除はしない。
投入するデータ方式
1 INSERT文
2 従来型パス・ロード
3 ダイレクト・パス・ロード
4 ダイレクト・パス・インサート
今回は、パーティション単位ではないし、初期データ投入でもないし、Enterprise Editionでもないため、1~3の順に試しました。
1は、12万件ぐらいまでは20分程度でしたが、表示を速くするため、カラムに色々Indexを作成すると、投入に90分ほど掛かるようになり、60分のデータを投入するのに90分掛かるようになったため、断念しました。
2は、sqlldrを使用するために、CSV方式にデータを出力する必要があります。
また同じくIndexを使えるために使用していました。15万件で20分程度かかり、Indexを作成した後も30分ほどで投入できましたが、後々問題になってくると思い、3の方法を試すことに。
3は、最初は、Indexが使えないと勘違いして困っていました。トリガーも無効になるというので困っていました。
このトリガーは、ユニークIDを保持するためシーケンスを作成し、入力トリガーで追加するようにしていました。
しかし、sqlldrでは、http://oracle.se-free.com/utl/C2_seq.htmlを参考にしたところ、
ID SEQUENCE(MAX, 1),
※1は省略可能
でうまくいきました。
この時、CSVファイルには、ID番号の項目は記載しません。
また、Indexを無効にし、投入後Indexを再構築するというのを知りましたが、時間が掛かるというのを知り、やはり避けていましたが、背に腹は代えられないということで、試しました。
その結果
20万件が3分
40万件が3分(2時間分のファイルをひとまとめ)
250万件が5分(12時間分のファイルをひとまとめ)
480万件が5分(24時間分のファイルをひとまとめ)
で終了しました。
素晴らしい~~~~~。
感動しました。こんなに速くなるのかと!
というわけで、躊躇している方がいましたら、是非試してみてください。
データ数
20万件/時間
1ファイル20MB程度。
現在
6,000万件以上のレコードあり。
しばらくの間削除はしない。
投入するデータ方式
1 INSERT文
2 従来型パス・ロード
3 ダイレクト・パス・ロード
4 ダイレクト・パス・インサート
今回は、パーティション単位ではないし、初期データ投入でもないし、Enterprise Editionでもないため、1~3の順に試しました。
1は、12万件ぐらいまでは20分程度でしたが、表示を速くするため、カラムに色々Indexを作成すると、投入に90分ほど掛かるようになり、60分のデータを投入するのに90分掛かるようになったため、断念しました。
2は、sqlldrを使用するために、CSV方式にデータを出力する必要があります。
また同じくIndexを使えるために使用していました。15万件で20分程度かかり、Indexを作成した後も30分ほどで投入できましたが、後々問題になってくると思い、3の方法を試すことに。
3は、最初は、Indexが使えないと勘違いして困っていました。トリガーも無効になるというので困っていました。
このトリガーは、ユニークIDを保持するためシーケンスを作成し、入力トリガーで追加するようにしていました。
しかし、sqlldrでは、http://oracle.se-free.com/utl/C2_seq.htmlを参考にしたところ、
ID SEQUENCE(MAX, 1),
※1は省略可能
でうまくいきました。
この時、CSVファイルには、ID番号の項目は記載しません。
また、Indexを無効にし、投入後Indexを再構築するというのを知りましたが、時間が掛かるというのを知り、やはり避けていましたが、背に腹は代えられないということで、試しました。
その結果
20万件が3分
40万件が3分(2時間分のファイルをひとまとめ)
250万件が5分(12時間分のファイルをひとまとめ)
480万件が5分(24時間分のファイルをひとまとめ)
で終了しました。
素晴らしい~~~~~。
感動しました。こんなに速くなるのかと!
というわけで、躊躇している方がいましたら、是非試してみてください。
コメント 0