- PR -

Oracle8.0.5 SQL*Loaderのダイレクトロードについて

1
投稿者投稿内容
さらのとうちゃん
会議室デビュー日: 2005/04/07
投稿数: 11
投稿日時: 2005-08-16 11:37
いつもお世話になっています。

Oracle SQL*Loaderのダイレクトロードについて質問があるのですが、

SQL*LOADERを使って索引付き(一意制約付き)の表にTRUNCATEモードで
ダイレクト・パス・ロードでインサートしようしています。

同じキーを持つCSVデータをLOADすると同じレコードができ、
Unique Indexが使用不可になってしまいます。

リファレンスには一意制約違反があると索引使用不可になるとあります。

一意制約違反があった場合、読み飛ばす、不良ファイルに書き出す等は
やっぱり従来型ロードしかできないのでしょうか?

宜しく御願いします。

今川 美保(夏椰)
ぬし
会議室デビュー日: 2004/06/10
投稿数: 363
お住まい・勤務地: 神奈川県茅ヶ崎市
投稿日時: 2005-08-16 13:28
8.0.5のマニュアルを見ている限りだと
ダイレクトロードで「読み飛ばす」「ファイルに書き出す」って事は出来なそうです。

そもそもの話になってしまいますが、
ロードするデータを重複排除して作る方法があれば
そちらを考えてみてはいかがでしょうか?

もしくはINDEXを使用不可の状態で(表だけの状態にして)
表に格納されているデータの重複チェック、重複排除を行った後
INDEXをREBUILDしてみるとか・・・。

私にはこれぐらいしか思いつきませんでした。
さらのとうちゃん
会議室デビュー日: 2005/04/07
投稿数: 11
投稿日時: 2005-08-16 14:06
夏椰様
ありがとうございます。

>そもそもの話になってしまいますが、
>ロードするデータを重複排除して作る方法があれば
>そちらを考えてみてはいかがでしょうか?
ん〜このデータは他システム(パッケージ)から連携されたデータでして、
難しいかなと思っています。

>もしくはINDEXを使用不可の状態で(表だけの状態にして)
>表に格納されているデータの重複チェック、重複排除を行った後
>INDEXをREBUILDしてみるとか・・・。

一回の取込で、10万レコード以上ありまして、
チェックするとしてもかなり時間がかかる様に思いますんで。

やっぱり従来型ロードしか手はないですかね。。。


今川 美保(夏椰)
ぬし
会議室デビュー日: 2004/06/10
投稿数: 363
お住まい・勤務地: 神奈川県茅ヶ崎市
投稿日時: 2005-08-16 14:26
引用:

さらのとうちゃんさんの書き込み (2005-08-16 14:06) より:
>そもそもの話になってしまいますが、
>ロードするデータを重複排除して作る方法があれば
>そちらを考えてみてはいかがでしょうか?
ん〜このデータは他システム(パッケージ)から連携されたデータでして、
難しいかなと思っています。

>もしくはINDEXを使用不可の状態で(表だけの状態にして)
>表に格納されているデータの重複チェック、重複排除を行った後
>INDEXをREBUILDしてみるとか・・・。

一回の取込で、10万レコード以上ありまして、
チェックするとしてもかなり時間がかかる様に思いますんで。

やっぱり従来型ロードしか手はないですかね。。。



10万レコードをファイルとして扱い
シェルやプログラムでデータチェックするのは
厳しいかもしれませんね。

ただ、テーブルに格納されたデータとして
10万って数値はそんなに多いとは思わないです。

自分の手元のOracleはWin版9iR2ですが、
143万件のデータを保持するテーブルに対し
非キー項目をWhere条件とし、FULLスキャンヒントをつけたSQLを発行しても
即時リターンが来ます。
#INDEXが使用不可である状態を作るために、非インデクス項目を条件とし
#FULLスキャンするように指定しました。

バージョンが違いますし、テーブル構造やレコード長など
性能の要因として違いが多々あるとは思いますが、
試す環境があれば試してみてから、
結果を出しても遅くはないと思います。

#ってINDEXのREBUILDを強く推奨しているわけではないのですが、
#結論を「思う」で出すのはもったいない気がしたもので・・・。
日本海流
会議室デビュー日: 2005/08/12
投稿数: 14
投稿日時: 2005-08-16 20:21
>一回の取込で、10万レコード以上ありまして、
>チェックするとしてもかなり時間がかかる様に思いますんで。
高々10万件程度だったら
ソートしてからプログラムで重複チェックすれば?
#可変長のバイナリデータとかじゃないですよね?

あとは、市販のソートツール探すとか。
さらのとうちゃん
会議室デビュー日: 2005/04/07
投稿数: 11
投稿日時: 2005-09-02 15:36
みなさんありがとうございます。

>自分の手元のOracleはWin版9iR2ですが、
>143万件のデータを保持するテーブルに対し
>非キー項目をWhere条件とし、FULLスキャンヒントをつけたSQLを発行しても
>即時リターンが来ます。

私の環境は WinNT Oracle8.0.5
なのですが、130万件位あるテーブルがあるのですが、
同じようにカウントのSQLを発行した場合、5分くらいかかってしまいます。

>バージョンが違いますし、テーブル構造やレコード長など
>性能の要因として違いが多々あるとは思いますが、
>試す環境があれば試してみてから、
>結果を出しても遅くはないと思います。

とりあえずやってみましたが、
ダイレクトロードと従来型ロードでは10分くらい遅延します。
それと、
環境が悪いのか、Oracleの設定・DB設計が悪いのかは解らないのですが、
従来型で取り込みを行った場合、
REDOログが多量に使用してしまいます。

アーカイブログモードで運用しています。
REDOログ : 50M
メンバー数 : 2
グループ数 : 8
でテストしましたが、
従来型ロードで取り込みを行うと 300M ほど使用しているみたいで
アーカイブファイルが6個もできてしまいます。

これが妥当なのかどうかの判断ができません。

チューニングでどうにかなるかと思い調べていますが、
改善されたまでいかない状態です。

ご指摘・アドバイス等ありましたら宜しく御願いします。
1

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