データベースのパフォーマンスを測定する ~ BenchBase

データベースの性能を正しく評価するには、実際のアプリケーションに近い負荷を再現し、スループット・レイテンシ・リソース使用率などを測定する必要があります。これが「データベースのベンチマーク」です。

ベンチマークを行う目的は明確で、次のような場面で役立ちます。

  • DBMS の比較:PostgreSQL と MySQL の違いを定量的に知りたい
  • 設定変更の効果検証:パラメータ調整やインデックス追加の前後で性能がどう変わるか
  • ボトルネックの特定:CPU・I/O・ロック競合など、どこが遅いのかを把握する
  • クラウド移行時の性能確認:オンプレとクラウドでどれくらい差が出るか

ただし、実際の業務ワークロードをそのまま再現するのは難しく、ベンチマーク環境の構築にも手間がかかります。 そこで役立つのが、標準化されたベンチマークフレームワーク BenchBase です。

BenchBase の概要

BenchBase は Carnegie Mellon University(CMU)の Database Group が開発している マルチ DBMS ベンチマークフレームワーク です。 以前は「OLTPBench」として知られていましたが、モダナイズを経て BenchBase として再構築されています。

出典:GitHub - cmu-db/benchbase: Multi-DBMS SQL Benchmarking Framework via JDBC · GitHub

BenchBase の主な特徴

  • PostgreSQL / MySQL / MariaDB / Oracle / SQLServer など JDBC に対応したデータベースをサポート。
  • TPC-C、TPC-H、Twitter、Wikipedia、YCSB、AuctionMark など多数のベンチマークを内蔵。
  • リクエストレート、トランザクションの割合など、負荷の細かい制御が可能。
  • 実データに近いアクセスパターンを再現可能。
  • レイテンシ(マイクロ秒精度)、スループット、OS リソース利用など統計情報の収集が充実。

BenchBase の使い方

実行環境

今回は AlmaLinux 9 に BenchBase をインストールしてベンチマークを実行します。

Javaインストール

BenchBase は Java 23 で動きます(2026年3月時点)。Java をダウンロードしてインストールします。

wget https://download.oracle.com/java/23/archive/jdk-23.0.2_linux-x64_bin.rpm
sudo rpm -ivh jdk-23.0.2_linux-x64_bin.rpm

OracleJDK を使用できない場合、OpenJDK 21 を利用することができます。

sudo dnf install java-21-openjdk java-21-openjdk-devel

バージョンを確認します。

java -version

ビルド

GitHub から clone します。

git clone --depth 1 https://github.com/cmu-db/benchbase.git
cd benchbase

java21を選択した場合は pom.xml ファイル内の以下の記述を 23 から 21 に変更します。

<java.version>23</java.version>
<maven.compiler.source>23</maven.compiler.source>
<maven.compiler.target>23</maven.compiler.target>

対象 DB のプロファイルを指定して Maven でビルドします。

# ./mvnw clean package -P <profile name>
./mvnw clean package -P postgres

<profile name> には postgres、sqlserver、mysql、oracle などのベンチマークを取得したいデータベースを指定します。今回はPostgreSQLのベンチマークを取得するので postgres を指定しました。

ビルドが正常に完了すると 以下のようなディレクトリ構成になります。

benchbase
┣━ config
┣━ CONTRIBUTING.md
┣━ CONTRIBUTORS.md
┣━ data
┣━ docker
┣━ lib
┣━ LICENSE
┣━ mvnw
┣━ mvnw.cmd
┣━ pom.xml
┣━ README.md
┣━ scripts
┣━ src
┗━ target

benchbase/target ディレクトリに以下のファイルが作成されます。今回は Linux 環境を使用しているので .tgzファイルを解凍します。

  • benchbase-<profile name>.tgz
  • benchbase-<profile name>.zip
tar zxf benchbase-postgres.tgz

解凍すると benchbase/target/benchbase-postgres に実行可能な benchbase.jar ファイルと設定ファイルが作成されるのでベンチマークを実行できます。

設定ファイルの作成

ベンチマークを動かすための設定ファイルは benchbase/target/benchbase-postgres/config/postgres ディレクトリにサンプルファイルがあります。

サンプルファイルは各ベンチマークタイプごとに用意されています。今回はTPC-Cを実行します。

sample_tpcc_config.xml から データロード用とベンチマーク用の2つの設定ファイルを作成します。

# データロード用
cp -p sample_tpcc_config.xml tpcc_load_config.xml
vi tpcc_load_config.xml
# ベンチマーク用
cp -p sample_tpcc_config.xml tpcc_exec_config.xml
vi tpcc_exec_config.xml

データロード、ベンチマークに必要な設定項目を見ていきます。

  • 共通設定
項目 設定例 解説          
type POSTGRES データベース製品名(固定)
driver org.postgresql.Driver ドライバー名(固定)
url jdbc:postgresql://ホスト名:ポート番号/データベース名? sslmode=require&ApplicationName=tpcc &reWriteBatchedInserts=true 接続先情報
username ユーザー名 データベースに接続するユーザー
password パスワード データベースに接続するユーザーのパスワード
reconnectOnConnectionFailure true 接続切断時の自動再接続
isolation TRANSACTION_READ_COMMITTED トランザクション分離レベル。使用するデータベースのデフォルトに合わせる。
scalefactor 10 データサイズ。TPCCでは倉庫数。
  • データロード用設定
項目 設定例 解説
batchsize 128 データのロード時に一度に挿入するレコード数。
loaderThreads 1 ロードの並列度。CPU/I/O に依存。
  • ベンチマーク用設定
項目 設定例 解説
batchsize 1 データのロード時に一度に挿入するレコード数。
terminals 10 同時クライアント数。scalefactor以下に設定すること。
time 600 計測時間。5~10分が目安。
rate 220 1 秒あたりのトランザクション発行数。
  • データロード設定ファイル例(tpcc_load_config.xml)
<?xml version="1.0"?>
<parameters>

    <!-- Connection details -->
    <type>POSTGRES</type>
    <driver>org.postgresql.Driver</driver>
    <url>jdbc:postgresql://ホスト名:ポート番号/データベース名?sslmode=require&amp;ApplicationName=tpcc&amp;reWriteBatchedInserts=true</url>
    <username>tpcc</username>
    <password>TPCC</password>
    <reconnectOnConnectionFailure>true</reconnectOnConnectionFailure>
    <isolation>TRANSACTION_READCOMMITED</isolation>
    <batchsize>128</batchsize>

    <!-- Scale factor is the number of warehouses in TPCC -->
    <scalefactor>200</scalefactor>

    <!-- The workload -->
    <terminals>10</terminals>
    <works>
        <work>
            <time>60</time>
            <rate>10000</rate>
            <weights>45,43,4,4,4</weights>
        </work>
    </works>
</parameters>
  • ベンチマーク設定ファイル例(tpcc_exec_config.xml)
<?xml version="1.0"?>
<parameters>
    <!-- Connection details -->
    <type>POSTGRES</type>
    <driver>org.postgresql.Driver</driver>
    <url>jdbc:postgresql://ホスト名:ポート番号/データベース名?sslmode=require&amp;ApplicationName=tpcc&amp;reWriteBatchedInserts=true</url>
    <username>tpcc</username>
    <password>TPCC</password>
    <reconnectOnConnectionFailure>true</reconnectOnConnectionFailure>
    <isolation>TRANSACTION_READCOMMITED</isolation>
    <batchsize>1</batchsize>

    <!-- Scale factor is the number of warehouses in TPCC -->
    <scalefactor>200</scalefactor>

    <!-- The workload -->
    <terminals>1</terminals>
    <works>
        <work>
            <time>600/time>
            <rate>220</rate>
            <weights>45,43,4,4,4</weights>
        </work>
    </works>
</parameters>

データロード

設定ファイルをもとにデータロードを実行します。 benchbase.jar が存在する benchbase/target/benchbase-postgres ディレクトリに移動して以下コマンドを実行します。

cd benchbase/target/benchbase-postgres
java -jar benchbase.jar --bench=tpcc --config=config/postgres/tpcc_load_config.xml --create=true --load=true

エラーなく「Finished loading data into TPCC database...」と出力されれば完了です。

データベースには以下のテーブルが作成されます。

benchbase=> \dt
          List of relations
 Schema |    Name    | Type  | Owner
--------+------------+-------+-------
 tpcc   | customer   | table | tpcc
 tpcc   | district   | table | tpcc
 tpcc   | history    | table | tpcc
 tpcc   | item       | table | tpcc
 tpcc   | new_order  | table | tpcc
 tpcc   | oorder     | table | tpcc
 tpcc   | order_line | table | tpcc
 tpcc   | stock      | table | tpcc
 tpcc   | warehouse  | table | tpcc

ベンチマーク実行

データが作成されたので、ベンチマークを実行します。

java -jar benchbase.jar --bench=tpcc --config=config/postgres/tpcc_exec_config.xml --create=true --load=true

以下のようなワークロードヒストグラムが出力されるとベンチマークが完了です。

[INFO ] 2026-03-27 11:25:10,872 [main]  com.oltpbenchmark.DBWorkload writeHistograms - Workload Histograms:

Completed Transactions:
com.oltpbenchmark.benchmarks.tpcc.procedures.NewOrder/01     [44084] ****************************************
com.oltpbenchmark.benchmarks.tpcc.procedures.Payment/02      [42420] **************************************
com.oltpbenchmark.benchmarks.tpcc.procedures.OrderStatus/03  [ 4009] *******
com.oltpbenchmark.benchmarks.tpcc.procedures.Delivery/04     [ 3948] *******
com.oltpbenchmark.benchmarks.tpcc.procedures.StockLevel/05   [ 3930] *******

Aborted Transactions:
com.oltpbenchmark.benchmarks.tpcc.procedures.NewOrder/01     [ 419] ****************************************

Rejected Transactions (Server Retry):
<EMPTY>

Rejected Transactions (Retry Different):
<EMPTY>

Unexpected SQL Errors:
<EMPTY>

Unknown Status Transactions:
<EMPTY>


[INFO ] 2026-03-27 11:25:10,872 [main]  com.oltpbenchmark.DBWorkload writeHistograms - =====================

このワークロードではトランザクション種別ごとの実行回数と成否が表示されます。 abortされているトランザクションもありますが、completeしたトランザクション数と比較して無視していいレベルです。

実行結果の確認

つづいてベンチマークの測定結果を確認します。 測定結果は benchbase/target/benchbase-postgres/results の summary.json ファイルに出力されます。

{
 "Start timestamp (milliseconds)": 1774578009770,
 "Current Timestamp (milliseconds)": 1774578310683,
 "Elapsed Time (nanoseconds)": 300000027169,
 "DBMS Type": "POSTGRES",
 "DBMS Version": "PostgreSQL 17.8 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 13.2.0, 64-bit",
 "Benchmark Type": "tpcc",
 "Final State": "EXIT",
 "Measured Requests": 98800,
 "isolation": "TRANSACTION_READ_COMMITTED",
 "scalefactor": "200",
 "terminals": "10",
 "Latency Distribution": {
  "95th Percentile Latency (microseconds)": 77979,
  "Maximum Latency (microseconds)": 1489768,
  "Median Latency (microseconds)": 25008,
  "Minimum Latency (microseconds)": 3521,
  "25th Percentile Latency (microseconds)": 12336,
  "90th Percentile Latency (microseconds)": 53441,
  "99th Percentile Latency (microseconds)": 112293,
  "75th Percentile Latency (microseconds)": 41612,
  "Average Latency (microseconds)": 30357
 },
 "Throughput (requests/second)": 329.3333035078116,
 "Goodput (requests/second)": 327.96997029794625
}

主に性能評価に用いる指標は「Latency Distribution」、「Throughput」、「Goodput」です。

Latency Distribution

ここで確認するのは「95th Percentile Latency (microseconds)」、「99th Percentile Latency (microseconds)」です。

95th Percentile Latency とは実行されたトランザクションを早いほうから順に並べて95%のデータが収まる時間を示します。目安としては 95th < 100000(microseconds)、99th < 150000(microseconds) であれば、OLTPのデータベースとして問題ありません。

他の値では、Median > 100000(microseconds) だと体感的に遅さを感じる可能性があります。

Throughput と Goodput

どちらも1秒間に実行されたリクエストの数ですが、Throughput が失敗、成功に関わらずすべてのリクエストを対象としているのに対して Goodput は成功したリクエストのみを対象としています。

Throughput とGoodput の差が1%程度で、かつレイテンシが安定していれば問題ないでしょう。

ベンチマークの比較

ベンチマークは1度だけとっても意味がありません。条件を変えてベンチマークを取得します。

性能の変化の要因を特定するために条件を1つずつ変えて実行します。

同時実行数を変更

設定ファイルの terminals を変更して負荷を高めます。

Aboted Transactionが増えてくるとシステムの限界に近いと考えられます。

サーバーのCPU数を変更

クラウドの PaaS では、自由にCPU数を変更して処理能力を高めます。

CPUに余裕がある場合、Throughput は頭打ちとなり、他の要因がボトルネックとなっている可能性があります。

データベースを変更

BenchBase は多くのデータベースに対応しているのでデータベースを変更することで傾向に差が現れるかもしれません。

おわりに

複数条件で繰り返しベンチマークを取得する過程では、同じ設定でも結果が揺れたり、事前に想定していた傾向と異なる数値が出たりと、検証に時間を要する場面が多くありました。

特にクラウド環境ではバックグラウンド処理やリソース割り当ての影響が見えにくく、結果のばらつきが発生しやすいことを改めて確認しています。

それでも条件を一つずつ変えながら比較を重ねることで、負荷のかかり方や同時実行数の変化に応じた性能の伸び方など、環境固有の特徴が明確に把握できました。

こうした傾向の把握は、今後の構成検討やチューニングの判断材料として有用だと感じています。

執筆担当者プロフィール
三条 光暢

三条 光暢(日本ビジネスシステムズ株式会社)

Oracle、PostgreSQLを中心に各種データベースの設計・構築・運用を携わっています。

担当記事一覧