h2databaseベンチマーク

トップ > チップス > h2databaseベンチマーク
2012-02-13, h2_bench

/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,以前行ったベンチマークテスト}

この記事は役に立ちましたか?