/tips/other/h2_bench **目的 1ヶ月で1,000,000行を超える大量の取引データ(仕入・売上)を高速に集計する能力を備えたデータベース探しています。現在のところ、{link:http://h2database.com,h2database}が最有力です。h2databaseに備わる複数の接続モード毎のパフォーマンスと、その他のデータベース(PostgreSQL 8.3を使用)のパフォーマンスを測定し、どのような場面でそれらを用いるべきか考察します。
**測定方法 以下のクエリで生成されるテーブルを利用しました(PostgreSQLの場合、IDENTITYはSERIALとなります)。このテーブルに一定数のレコードを追加(INSERT)し、その後、同数の更新(UPDATE)を行います。
:CREATE TABLE samples (id IDENTITY,col_int INTEGER,col_num NUMERIC,col_var VARCHAR)
StatementオブジェクトのexecuteUpdate(String)メソッドを利用して、文字列でクエリを渡す方法と、PreparedStatementを利用してコンパイル済みクエリにパラメタを渡した後、クエリを実行する方法のそれぞれで測定を行います(詳細はソースコードを参照)。各測定の前にテーブルを一旦削除(DROP)し、空の状態から測定が行えるようにしています。
-ソースコード:{file:SpeedCheck.java}
プログラムの実行を行ったマシンのスペックは以下の通りです。 CPU: Intel Core 2 Duo T7500 Mem: 2G OS: Windows XP SP2 Java: JDK1.6.0
**結果 1,000,000レコードの処理に要した時間(秒数)は以下の表の通りです。PostgreSQLについては100,000レコード(h2の1/10)で試行した結果を10倍して掲載しています。 ${image:table.png}
以下の表では、1秒あたりの処理件数を求め、比較しています。 ${image:graph.png}
-{file:SpeedTestResult.ods}
***参考:In-memoryの速度 「jdbc:h2:mem:db」形式のURLで利用可能なインメモリのデータベースについても、同様の試験(1,000,000レコード)を実施しましたが、(残念ながら)デフォルトのVM設定ではOutOfMemoryErrorが発生してしまいます。10分の1のサイズ(100,000レコード)であれば、上記のテストは全て2秒以内に収まります。
**考察 h2databaseを利用すると、(今回のテストケースに於いては)PostgreSQLの10倍以上のパフォーマンスが見込めます。複数のクライアントからの接続が不要なら、直接ファイルにアクセスするfileモード(embedded)を使ってさらにパフォーマンスを改善することが可能です。サンプルに使ったテーブルのレコード(行)当たりのサイズは多少小さめなので、実際にはもう少し重たくなると考えられますが、百万件単位の追加・更新作業でも数分~数十分のオーダーで処理できるでしょう。
-{link:http://lumber-mill.co.jp/gallery/view/tips/other/database_bench,以前行ったベンチマークテスト}
- タグ別一覧: [h2_bench]
- チップス一覧
この記事は役に立ちましたか?
- EnglishWorm.com
- SinglesFan.com
- LmLab.net
- サイトマップ
- 運営者について