2009/11/25

一回のトランザクションの量

気にしたことがなかったのですが、BeginTran()~Commit() の間に実行できるSQL文の量って、制限があるのでしょうか。
RDBサーバーの使用可能なメモリー量とRDBの作業領域の規定で決まると思います。
普通に使っていると制限を受けることは無いと思ってました。
バッチで数100万件の更新をRoleback()することもあるので尚更でした。

郵便番号CSVデータ(約12万件)の取り込みを私の環境下で動く8種類のRDBで行いました。
(*)数値を明示すると、規定に抵触するので、目安数字を記します。


SQL server 7.2分
MDB 8.1分
Oracle 10g 7.5分
MySQL inno 7.2分
Postgres 6.8分
SQLite 5.6分

数千件の時とは異なり、SQLiteが早い結果になりました。Postgresも優位。大量データに有利な作りなんでしょうか。

DB2 は SQL0964C のエラーが出て、Abendしました。メモリ不足で続行不能になります。 30000件前後でアウトでした。
          「トランザクションログがいっぱい」のようです。

Firebird は40000件前後で unable to allocate memory from operating system が出て、落ちました。

デフォルトのまま使用していると、限度があるということでしょうか。
SQL Server/Oralcleでは、なにも考慮しないで、使っていただけに、少しショックでした。
大量件数のバッチが途中で転けることになったらエライことです。実データ量での動作確認は必要ですが、
SQL Server/Oralcleでトランザクション量の限界テストって、どのあたりまで、考慮するのでしょうね。
ログを自動拡張していると、制限なし...ですね。
以前のOracleだと、ログのサイズ制限があって制約があったようですが、今は無い..ですよね。
ログ制約は押さえないと駄目ですが、デフォルト使用で、30000万件程度で落ちるのは、不親切な気もします。

0 件のコメント:

コメントを投稿