C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: ODP.NETでORA-24381エラー


(過去ログ 57 を表示中)

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■32135 / inTopicNo.1)  ODP.NETでORA-24381エラー
  
□投稿者/ aetos (85回)-(2009/02/02(Mon) 11:41:24)
aetos さんの Web サイト

分類:[データベース全般] 

お世話になります。

環境を先に書いておきますと、
Windows XP Pro SP3
VisualStudio.NET 2003
C#
ODP.NET
Oracle 10.1
です。

配列バインドを使った大量データの INSERT 文の発行時に OracleException が発生します。
エラーコードは ORA-24381 です。
ログには OracleException.Errors の内容も出すようにしているのですが、今回は出ていませんでした。
ここから、配列の中身ではなく、配列自体に何らかの問題があるのではないかと疑っています。
配列の要素数は 302,400 件です。
配列バインドで使用可能な要素数の上限があるのかと思い探してみましたが、有用な情報は得られませんでした。

何か手掛かりをお持ちの方がいらっしゃいましたらご教示ください。
よろしくお願いします。
引用返信 編集キー/
■32137 / inTopicNo.2)  Re[1]: ODP.NETでORA-24381エラー
□投稿者/ こあら (46回)-(2009/02/02(Mon) 11:59:19)
> ORA-24381 DML配列のエラー

「insert文が失敗している」のですから、配列の中身、あるいはinsert処理に問題があるのだと思います。
# PK重複、テーブル領域やロールバックセグメントのオーバーフローなど。

引用返信 編集キー/
■32152 / inTopicNo.3)  Re[2]: ODP.NETでORA-24381エラー
□投稿者/ aetos (86回)-(2009/02/02(Mon) 13:26:43)
aetos さんの Web サイト
No32137 (こあら さん) に返信
>>ORA-24381 DML配列のエラー
>
> 「insert文が失敗している」のですから、配列の中身、あるいはinsert処理に問題があるのだと思います。
> # PK重複、テーブル領域やロールバックセグメントのオーバーフローなど。

ありがとうございます。

配列中に PK 重複になるようなデータが含まれるのであれば、OracleException.Errors にそのエラーが入ってくると思います。
今回はそれがありませんので、PK 重複ではないと思っています。
「テーブル領域やロールバックセグメントのオーバーフロー」であるかどうかは、どのように調べればよいのでしょうか。

なお、

SELECT
 AVG(NVL(VSIZE(列1),1)) +
 AVG(NVL(VSIZE(列2),1)) +
 AVG(NVL(VSIZE(列3),1)) +
 …
FROM
 テーブル

という SQL を走らせてみますと、1レコードのサイズは約 107 バイト程度のようです。
これが 302,400 件ですと、31,784 KB ほどになります。
これに対して、表領域は 1,500,000 KB 以上の空きがありますが、ロールバックセグメントは最大で 384KB、うち 98% ほどが使用済みでした。
ただ、お恥ずかしながら DB 音痴のため、ロールバックセグメントのサイズが適切なのかどうかわかりません。
よろしければご教示願えませんでしょうか。
引用返信 編集キー/
■32153 / inTopicNo.4)  Re[3]: ODP.NETでORA-24381エラー
□投稿者/ aetos (87回)-(2009/02/02(Mon) 13:30:40)
aetos さんの Web サイト
No32152 (aetos さん) に返信
> という SQL を走らせてみますと、1レコードのサイズは約 107 バイト程度のようです。
> これが 302,400 件ですと、31,784 KB ほどになります。
> これに対して、表領域は 1,500,000 KB 以上の空きがありますが、ロールバックセグメントは最大で 384KB、うち 98% ほどが使用済みでした。
> ただ、お恥ずかしながら DB 音痴のため、ロールバックセグメントのサイズが適切なのかどうかわかりません。
> よろしければご教示願えませんでしょうか。

ロールバックセグメントが入っている表領域には、空きが 9,000 KB 程度しかありませんでした。
これが原因でしょうか?
引用返信 編集キー/
■32176 / inTopicNo.5)  Re[4]: ODP.NETでORA-24381エラー
□投稿者/ こあら (47回)-(2009/02/02(Mon) 19:06:27)
2009/02/02(Mon) 19:19:54 編集(投稿者)

私もgoogleですぐに調べられる程度のことしか分かりません。

やってみるとしたら、こんなことでしょうか。
・バルクinsertを実行して V$ROLLSTAT を監視する。
・処理を1,000件ごとにcommitするように書き換えて実行してみる。

いまいち役立たずですみません。。。

[追記]
ロールバックセグメントは8i以前の名前で、9iからは「UNDOセグメント」と言うそうです。
http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/server.102/B19224-02/undo.htm
[/追記]

引用返信 編集キー/
■32177 / inTopicNo.6)  Re[4]: ODP.NETでORA-24381エラー
□投稿者/ aetos (88回)-(2009/02/02(Mon) 19:45:08)
aetos さんの Web サイト
No32153 (aetos さん) に返信

> ロールバックセグメントが入っている表領域には、空きが 9,000 KB 程度しかありませんでした。
> これが原因でしょうか?

この表領域は、AUTOEXTEND ON MAXSIZE UNLIMITED となっていました。
この場合、表領域のサイズが足りなければ、自動的に拡張されそうな気がします。

また、素人考えでは、ロールバックセグメント(Undoセグメント)のサイズが不足したとしても、それは未コミットデータを読み取ろうとした時に失敗こそすれ、INSERT 自体に失敗はしないのではないかと思うのですが、そうでもないのでしょうか。

引用返信 編集キー/
■32178 / inTopicNo.7)  Re[5]: ODP.NETでORA-24381エラー
□投稿者/ aetos (89回)-(2009/02/02(Mon) 19:46:07)
aetos さんの Web サイト
No32176 (こあら さん) に返信
> やってみるとしたら、こんなことでしょうか。
> ・バルクinsertを実行して V$ROLLSTAT を監視する。
> ・処理を1,000件ごとにcommitするように書き換えて実行してみる。

ありがとうございます。
データの準備にも時間がかかりますし、すぐに試せる状況でもないので、数日頂くことになるかもしれません。
引用返信 編集キー/
■32180 / inTopicNo.8)  Re[5]: ODP.NETでORA-24381エラー
□投稿者/ こあら (48回)-(2009/02/02(Mon) 22:01:10)
> また、素人考えでは、ロールバックセグメント(Undoセグメント)のサイズが不足したとしても、それは未コミットデータを読み取ろうとした時に失敗こそすれ、INSERT 自体に失敗はしないのではないかと思うのですが、そうでもないのでしょうか。

UNDOするための情報を保持できなくなる(=ロールバックできなくなる)のですから、
INSERT自体も継続させられないと思います。

それとは別に「65535件の壁」という話もあるみたいです。こちらが本命かも。
http://otndnld.oracle.co.jp/document/products/oracle10g/101/generic/B13723-07/ch01.htm
http://www.oracle.co.jp/forum/thread.jspa?threadID=28001617&tstart=1235

引用返信 編集キー/
■32212 / inTopicNo.9)  Re[6]: ODP.NETでORA-24381エラー
□投稿者/ aetos (90回)-(2009/02/03(Tue) 15:01:00)
aetos さんの Web サイト
No32180 (こあら さん) に返信
> それとは別に「65535件の壁」という話もあるみたいです。こちらが本命かも。
> http://otndnld.oracle.co.jp/document/products/oracle10g/101/generic/B13723-07/ch01.htm
> http://www.oracle.co.jp/forum/thread.jspa?threadID=28001617&tstart=1235

こちらが本命だったようです。
同じ表領域、同じロールバックセグメントで同じ構造のテーブルを作り、1レコード160バイト程度のデータを INSERT してみたところ、
・65534件×1回は成功しました
・65565件×1回は同じ例外で失敗しました。
・65534件×10回は、一括コミット、一括ロールバックともに成功しました。

というわけで、「大量データの配列バインドの際には、1回のコマンド実行でバインドできる配列の要素数は最大 65534。コミットは何件一括でも可能」という結論に達しました。

ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -