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ファイルでサーバを設定しないとエラーログを吐く不具合修正。
・使用方法 ①CREATE.SQLのSQL文をISQL等で実行して下さい。 データベースのパスは必要に応じて変更して下さい。
②DM_BLob.iniを編集して下さい。
[DATABASE] SERVER=Localhost DBFILE=E:DBBLOB1.FDB UserID=SYSDBA Passwd=masterkey
説明の必要はないかと思いますが、先ほどのファイル配置に合わせて変更し、またIDとパスワードを適宜設定して下さい。
③BlobIns.exeを実行して下さい。 ④スピンエディットでインサート回数を設定し、Startボタンを押すと開始します。 ⑤途中で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 の最大 : 3134ミリ秒 --- 100000回 Insert の最小 : 20ミリ秒
--- 100000回 Insert の平均 : 21.23ミリ秒 --- 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)
|