■しかくBLOBのインサートテスト (2004年1月17日 林 務)
firebird-jp-generalに投稿した、BLOBのインサートに関するテストプログラムとレポートです。
BLOB_INSERT_TEST_0-2.LZH (IBX版)
BLOB_INSERT_TEST_BDE_0-2.LZH (BDE版。BDEがインストールされていないと実行できません。)
BLOB_INSERT_RSC.LZH (使用した画像リソース。実行には不要です。)
※(注記)変更点(ver.0.2)
・コネクションタイムを統計から排除。
・iniファイルでサーバを設定しないとエラーログを吐く不具合修正。
・使用方法
1CREATE.SQLのSQL文をISQL等で実行して下さい。
データベースのパスは必要に応じて変更して下さい。
2DM_BLob.iniを編集して下さい。
[DATABASE]
SERVER=Localhost
DBFILE=E:DBBLOB1.FDB
UserID=SYSDBA
Passwd=masterkey
説明の必要はないかと思いますが、先ほどのファイル配置に合わせて変更し、またIDとパスワードを適宜設定して下さい。
3BlobIns.exeを実行して下さい。
4スピンエディットでインサート回数を設定し、Startボタンを押すと開始します。
5途中でStopボタンを押せば中断することができます。
■しかくテスト(1) --- Delphi6 + IBX6.08
サーバはローカルのFirebird 1.0.3へ(削除) Localhostで (削除ここまで)ローカル接続しました。
マシンスペックは、Pentium4 2.4G + Mem 1GB + Diskは新品のSeagate 160GBです。
10万レコードのインサートを行った結果が以下のようになりました。(削除) ※(注記)下の最大値・平均値は、開始時のコネクションタイムが入ってしまっていました。ただいま追試中です。 (削除ここまで)(削除) --- 100000回 Insert の平均 : 65.19925ミリ秒--- 100000回 Insert の平均 : 21.23ミリ秒
--- 100000回 Insert の最大 : 3134ミリ秒
--- 100000回 Insert の最小 : 20ミリ秒
(削除ここまで)
--- 100000回 Insert の最大 : 70ミリ秒
--- 100000回 Insert の最小 : 10ミリ秒
ファイルのサイズは以下のようになりました。
2004年01月17日 14:21 2,048,008,192 BLOB1.FDB
2004年01月17日 14:21 2,048,008,192 BLOB2.FDB
2004年01月17日 14:21 2,048,008,192 BLOB3.FDB
2004年01月17日 14:21 2,048,008,192 BLOB4.FDB
2004年01月17日 14:21 1,231,175,680 BLOB5.FDB
■しかくテスト(1)-2 --- Delphi6 + IBX6.08 10万行インサート後の追加
テスト結果(1)の10万行インサート後に、再度コネクトし100行のインサートを行った。
--- 100回 Insert の平均 : 30.05ミリ秒
--- 100回 Insert の最大 : 761ミリ秒
--- 100回 Insert の最小 : 10ミリ秒
■しかくテスト(1)-3 --- Delphi6 + IBX6.08 with Firebird 1.5 RC8
テスト(1)-1と同一の内容を、Firebird 1.5 RC8で行った結果。(削除) ※(注記)と思ったら、10,000回になってました。要追試。 (削除ここまで)
(削除) --- 10000回 Insert の平均 : 20.7689ミリ秒
--- 10000回 Insert の最大 : 41ミリ秒
--- 10000回 Insert の最小 : 10ミリ秒 (削除ここまで)
--- 100000回 Insert の平均 : 10.75ミリ秒
--- 100000回 Insert の最大 : 261ミリ秒
--- 100000回 Insert の最小 : 10ミリ秒
■しかくテスト(1)-4 --- Delphi6 + IBX6.08 with Firebird 1.5 RC8 1万行インサート後の追加
テスト(1)-2と同一の内容を、Firebird 1.5 RC8で行った結果。(削除) ※(注記)これも1万行インサート後なので、要追試。 (削除ここまで)
(削除) --- 100回 Insert の平均 : 23.53ミリ秒
--- 100回 Insert の最大 : 330ミリ秒
--- 100回 Insert の最小 : 10ミリ秒 (削除ここまで)
--- 100回 Insert の平均 : 16.47ミリ秒
--- 100回 Insert の最大 : 651ミリ秒
--- 100回 Insert の最小 : 10ミリ秒
■しかくテスト(2) --- Delphi6 + BDE
BDE版の結果です。接続方法をBDEに変更した他、BDEでのLocalhost指定がエラーとなるため、ローカル接続で計測しました。
--- 100000回 Insert の平均 : 33.99ミリ秒
--- 100000回 Insert の最大 : 81ミリ秒
--- 100000回 Insert の最小 : 20ミリ秒
■しかくテスト(2)-2 --- Delphi6 + BDE 10万行インサート後の追加
テスト結果(2)の10万行インサート後に、再度コネクトし100行のインサートを行った。
--- 100回 Insert の平均 : 2006.08ミリ秒
--- 100回 Insert の最大 : 198465ミリ秒
--- 100回 Insert の最小 : 10ミリ秒
ログは以下のようになっています。
0回目Insert時間 --- 198465ミリ秒
1回目Insert時間 --- 10ミリ秒
2回目Insert時間 --- 10ミリ秒
・・・以下大体同じ
■しかくテスト(2)-3 --- Delphi6 + BDE with Firebird 1.5 RC8
テスト(2)-1と同一の内容を、Firebird 1.5 RC8で行った結果。
--- 100000回 Insert の平均 : 22.01ミリ秒
--- 100000回 Insert の最大 : 280ミリ秒
--- 100000回 Insert の最小 : 10ミリ秒
■しかくテスト(2)-4 --- Delphi6 + BDE with Firebird 1.5 RC8 10万行インサート後の追加
テスト(2)-2と同一の内容を、Firebird 1.5 RC8で行った結果。
--- 100回 Insert の平均 : 2023.61ミリ秒
--- 100回 Insert の最大 : 200238ミリ秒
--- 100回 Insert の最小 : 10ミリ秒
■しかく考察
テスト(1)とテスト(2)で有意に差があるのが、10万件インサート後の再インサート時の問題です。BDEでは、0からのインサートではIBXより遅いものの平均してそれなりの速度でインサートに成功しています。しかし、いったん切断した後で再接続しインサートしようとした場合、1件目のインサートで極端に遅くなります。IBXも確かに再接続後の1件目が少し遅いのですが、問題とならない範囲です。
このことから、大量のBLOBインサートを伴う、大規模データベースでは、BDEよりもIBXを使うべきであるという結論が導き出されるかと思います。(20041/17)