- PR -

大量データについて

1
投稿者投稿内容
もんが〜
会議室デビュー日: 2005/08/03
投稿数: 6
投稿日時: 2005-08-03 09:55
どうも初めましてもんが〜です。
お時間のある時にでもご助言頂けると嬉しいです。

【状況】
・テーブルA ( 997万件 )に対し、項目を追加したい
・普通にAlter Tableすると、UNDO領域不足で落ちる
・UNDO領域は拡張不可(サーバが一杯なので)

【やってみた&みてること】
・テーブルAのバックアップテーブル(bk_テーブルA)を作る
・テーブルAをTruncate
・テーブルAをAlter
-----
で、bk_テーブルAからテーブルAにデータを戻したいん
ですけれども。。。。
-----
・Insert into SELECT では落ちる(UNDO領域不足)
 (条件を絞り込んでやろうにも、回数に多くなり過ぎて埒が明かない)
・Export ⇒ dmpファイル ⇒ Import では、テーブル定義が
 不一致なのでエラーになる
-----
ということで、しょうがないので一旦CSVファイルに吐き出して
SQL*Loaderで取り込もうと思ってるのですが。。。
試算だとCSVファイルが1.9Gくらいになりそうな勢いなんですよね。
(そして、作成にも数時間かかってるという。。。)

これでホントにLoadできるのか? とか
もっと良い案があるのでは? とか

色々迷ってます。

どうか助けてください!
Desmo
大ベテラン
会議室デビュー日: 2004/03/24
投稿数: 149
投稿日時: 2005-08-03 13:22
データベースはOracleですよね。
OracleではDML文(INSERT、UPDATE、DELETE)発行時にトランザクションを無効にする設定はないので・・・
Insert into SELECT を(プログラム等組んで)分割して発行するくらいしか思いうかびませんが。
いーた
大ベテラン
会議室デビュー日: 2004/07/12
投稿数: 154
お住まい・勤務地: 東京
投稿日時: 2005-08-03 13:48
・bk_テーブルAを作成
・テーブルAにカラム追加を行った状態のテーブルA´をNOLOGGING指定で作成
・INSERT INTO SELECT〜でbk_テーブルAからテーブルA´へデータ移行
・テーブルAをTRUNCATE&ALTER
・テーブルA´をEXPしてテーブルAにIMP

全くの思いつきですが。
もんが〜
会議室デビュー日: 2005/08/03
投稿数: 6
投稿日時: 2005-08-03 15:50
Desmosediciさん
い〜たさん
返信どうもありがとうございます。
いろいろ試したのですが、やっぱりダメでした。

ですが、何とか解決することができました。
解決方法を参考のため下記の通り報告します。

SQL文一発でなく、PL/SQLでバルクフェッチ&バルクインサートすると
ばっさりインサートできるうえに、一定件数ごとにコミットできて
UNDO表領域の呪縛から解かれました。


本当にどうもありがとうございましたm(__)m
1

スキルアップ/キャリアアップ(JOB@IT)