[pgsql-jp: 38906] Re: 大量のデータの登録時に、メモリ不足エラー

"笹倉 雅和" sasakura @ technicalunion.co.jp
2007年 10月 29日 (月) 14:18:12 JST


笹倉です。

ご意見、アドバイス、ありがとうございます。
プログラムは、お察しの通りのものです。
以下に、変数名等は変えましたが、プログラムを張り込ませてもらいます。
言語は、PowerBuilderというものですが、関数の内部動作などは、おそらく
察しがつくのではないかと思います。

このプログラムのループが約13万回繰り返されていて、その途中で
エラーが発生しています。
一つ気になる点として、本来なら、SELECTを行い、INSERT又は
UPDATEを行うべきなのかもしれませんが、UPDATEを実行し
実行結果によってINSERTを行うようにしていますが、これは問題
ないでしょうか?

1トランザクションで行う処理が多すぎるが為に発生しているのではないか
とは自分でも思ったので、記載のプログラムのループを、ある条件毎に、10分
の1づつぐらいで、区切ってやるとエラーは発生せずに、処理は正常に終了
しました。この結果からは、処理の量による可能性が高いようなので、
上記UPDATEとINSERTのやり方を変えたとしても、根本的な解決に
はならいような気がします。
処理の量による問題なら、大量のデータを扱う場合、こまめにトランザクションを
分割するしか方法はないのでしょうか?
因みに、みなさんは、大量のデータを扱う場合どうしていますか?





for ll_Index=1 to ll_Rows
	ls_Field1 = dw_teiban_update_data.GetItemString(ll_Index, "field1")
	ls_Field2 = dw_teiban_update_data.GetItemString(ll_Index, "field2")
		・
		・
		・
	ls_Field17 = dw_teiban_update_data.GetItemString(ll_Index, "field17")

	update t_tgnet_data
		set field1 = :ls_Field1,
			field2 = :ls_Field2,
				・
				・
				・
			field17 = :ls_Field17
		where field1 = :ls_Field1 and
			field2 = :ls_Field2 and
			field3 = :ls_Field3
		using SQLCA ;
	if SQLCA.SqlCode = 0 and SQLCA.Sqlnrows = 0 then
		// 更新行が0なら
		insert into t_tgnet_data
			(	field1,						field2,					field3,					field4,
					・
					・
					・
				field21,					field22,				field23,				field24 )
			values (
				:ls_Field1,					:ls_Field2,				:ls_Field3,				:ls_Field4,
					・
					・
					・
				:ld_Field21,				:ld_Field22,			0,						:ll_Field24 )
			using SQLCA ;
		if SQLCA.SqlCode <> 0 then
			fx_LogOut("「t_tgnet_data」へデータ登録中にエラーが発生しました		" + SQLCA.SqlErrText)
			ll_Result = -1
		end if
	elseif SQLCA.SqlCode <> 0 then
		fx_LogOut("「t_tgnet_data」へデータ登録中にエラーが発生しました		" + SQLCA.SqlErrText)
		ll_Result = -1
	end if

	if ll_Result = 0 then
		// 処理済みフラグオン
		update m_teiban_kakaku
			set end_flag = 1
			where field1 = :ls_Field1 and
				field2 = :ls_Field2 and
				field3 = :ls_Field3
			using SQLCA ;
		if SQLCA.SqlCode <> 0 then
			fx_LogOut("「m_teiban_kakaku」へ更新フラグ設定中にエラーが発生しました		" + SQLCA.SqlErrText)
			ll_Result = -1
		end if
	else
		exit
	end if
next


TU/笹倉






pgsql-jp メーリングリストの案内