テストキット Tiny TPC-B ======================= TPC-Bとは --------- `TPC-B `_ とは、 `TPC `_ によって策定されたベンチマーク仕様の一つです。 銀行の窓口業務をモデルにしたトランザクションを実行し、システムの性能を測定します。 データベースのER図を以下に示します。 .. image:: images/tpc-b.png * branches : 銀行の支店を表しています。 このテーブルのレコード数がデータベース全体の規模を決めるスケールファクターになっています。 * tellers : 銀行員を表しています。 支店あたり10名の銀行員がいます。 * accounts : 銀行口座を表しています。 支店あたり10万の口座があります。 * history : 取引履歴を表しています。 TPC-Bでは1種類のトランザクションが定義されています。 これは以下のSQLを順番に発行するものです。 .. code-block:: mysql UPDATE accounts SET abalance = abalance + :1 WHERE aid = :2; SELECT abalance FROM accounts WHERE aid = :1; UPDATE tellers SET tbalance = abalance + :1 WHERE aid = :2; UPDATE branches SET bbalance = abalance + :1 WHERE aid = :2; INSERT INTO history (aid, aid, aid, delta) VALUES (:1, :2, :3, :4); COMMIT; TPC-BのCRUD図を以下に示します。 TPC-Bには更新の割合が非常に高いという特徴があります。 =========== ======== ======= ======== ======= Transaction branches tellers accounts history =========== ======== ======= ======== ======= TPC-B U U RU C =========== ======== ======= ======== ======= Tiny TPC-Bとは -------------- Tiny TPC-Bは、TPC-B Standard Specification 2.0の仕様を抜粋しJdbcRunnerのスクリプトとして実装したものです。 仕様書のうち以下の章節を実装しています。 * 1 Transaction Profile * 1.2 The Transaction Profile * 3 Logical Database Design * 4 Scaling Rules * 5 Distribution, Partitioning, and Transaction Generation それ以外の章節については実装されていないか、仕様を満たしていません。 従ってTiny TPC-Bのテスト結果は正式なTPC-Bのスコアではありません。 Tiny TPC-Bは以下の2つのスクリプトから構成されています。 * scripts/tpcb_load.js : テストデータ生成用スクリプト * scripts/tpcb.js : テスト用スクリプト 動作確認RDBMS ------------- Tiny TPC-Bは、以下のRDBMSで動作確認をしています。 * Oracle Database 21c * MySQL 8.0 * PostgreSQL 15 テストの準備 ------------ MySQLにおけるテストの準備手順を以下に示します。 Oracle Database、PostgreSQLについてはscripts/tpcb_load.jsのコメントをご参照ください。 データベースの作成 ^^^^^^^^^^^^^^^^^^ MySQLにrootユーザーで接続し、tpcbデータベースを作成します。 .. code-block:: mysql shell> mysql -u root -p sql> CREATE DATABASE tpcb; Query OK, 1 row affected (0.00 sec) ユーザーの作成 ^^^^^^^^^^^^^^ tpcbユーザーを作成します。 .. code-block:: mysql sql> CREATE USER tpcb@'%' IDENTIFIED BY 'tpcb'; Query OK, 0 rows affected (0.00 sec) sql> GRANT ALL PRIVILEGES ON tpcb.* TO tpcb@'%'; Query OK, 0 rows affected (0.00 sec) ネットワーク環境によっては、接続元ホストを制限したりtpcbをより安全なパスワードに変更したりすることをおすすめします。 テストデータの生成 ^^^^^^^^^^^^^^^^^^ scripts/tpcb_load.jsを用いてテストデータを生成します。 このスクリプトは以下の処理を行っています。 * テーブルの削除 * テーブルの作成 * データロード * インデックスの作成 (MySQLの主キーはデータロード前に作成) * 統計情報の更新 .. code-block:: text shell> java JR ../scripts/tpcb_load.js -logDir logs_sample09 13:16:30 [INFO ] > JdbcRunner 1.3.1 13:16:30 [INFO ] [Config] Program start time : 20230331-131630 Script filename : ../scripts/tpcb_load.js JDBC driver : - JDBC URL : jdbc:mysql://localhost:3306/tpcb?rewriteBatchedStatements=true JDBC user : tpcb Load mode : true Number of agents : 4 Auto commit : false Debug mode : false Trace mode : false Log directory : logs_sample09 Parameter 0 : 0 Parameter 1 : 0 Parameter 2 : 0 Parameter 3 : 0 Parameter 4 : 0 Parameter 5 : 0 Parameter 6 : 0 Parameter 7 : 0 Parameter 8 : 0 Parameter 9 : 0 13:16:31 [INFO ] Tiny TPC-B - data loader 13:16:31 [INFO ] -param0 : Scale factor (default : 16) 13:16:31 [INFO ] -nAgents : Parallel loading degree (default : 4) 13:16:31 [INFO ] Scale factor : 16 13:16:31 [INFO ] Parallel loading degree : 4 13:16:31 [INFO ] Dropping tables ... 13:16:31 [WARN ] JavaException: java.sql.SQLSyntaxErrorException: Unknown table 'tpcb.history' 13:16:31 [WARN ] JavaException: java.sql.SQLSyntaxErrorException: Unknown table 'tpcb.accounts' 13:16:31 [WARN ] JavaException: java.sql.SQLSyntaxErrorException: Unknown table 'tpcb.tellers' 13:16:31 [WARN ] JavaException: java.sql.SQLSyntaxErrorException: Unknown table 'tpcb.branches' 13:16:31 [INFO ] Creating tables ... 13:16:31 [INFO ] Loading branch id 1 by agent 3 ... 13:16:31 [INFO ] Loading branch id 4 by agent 0 ... 13:16:31 [INFO ] Loading branch id 3 by agent 2 ... 13:16:31 [INFO ] Loading branch id 2 by agent 1 ... 13:16:35 [INFO ] Loading branch id 5 by agent 3 ... 13:16:36 [INFO ] Loading branch id 6 by agent 0 ... 13:16:36 [INFO ] Loading branch id 7 by agent 1 ... 13:16:36 [INFO ] Loading branch id 8 by agent 2 ... 13:16:39 [INFO ] Loading branch id 9 by agent 3 ... 13:16:40 [INFO ] Loading branch id 10 by agent 1 ... 13:16:40 [INFO ] Loading branch id 11 by agent 0 ... 13:16:40 [INFO ] Loading branch id 12 by agent 2 ... 13:16:42 [INFO ] Loading branch id 13 by agent 3 ... 13:16:43 [INFO ] Loading branch id 14 by agent 0 ... 13:16:43 [INFO ] Loading branch id 15 by agent 2 ... 13:16:43 [INFO ] Loading branch id 16 by agent 1 ... 13:16:47 [INFO ] Analyzing tables ... 13:16:47 [INFO ] Completed. 13:16:47 [INFO ] < JdbcRunner SUCCESS 「Unknown table 'history'」などの警告は、存在しないテーブルを削除しようとして出力されるものです。 無視して構いません。 -param0を指定することによって、スケールファクターを変更できます。 スケールファクター1あたり、branchesテーブルが1レコード、tellersテーブルが10レコード、accountsテーブルが10万レコード増加します。 デフォルトのスケールファクターは16です。 -nAgentsを指定することによって、ロードの並列度を変更できます。 CPUコア数の多い環境では、並列度を上げることでロード時間を短縮できます。 デフォルトの並列度は4です。 .. code-block:: text shell> java JR ../scripts/tpcb_load.js -nAgents 8 -param0 100 テストの実行 ------------ scripts/tpcb.jsを用いてテストを実行します。 以下の例ではlocalhostのRDBMSに対してテストを行っていますが、実際にはJdbcRunnerとRDBMSを異なるコンピューターに配置することをおすすめします。 .. code-block:: text + java JR ../scripts/tpcb.js -logDir logs_sample09 -warmupTime 60 -measurementTime 180 13:16:47 [INFO ] > JdbcRunner 1.3.1 13:16:47 [INFO ] [Config] Program start time : 20230331-131647 Script filename : ../scripts/tpcb.js JDBC driver : - JDBC URL : jdbc:mysql://localhost:3306/tpcb JDBC user : tpcb Warmup time : 60 sec Measurement time : 180 sec Number of tx types : 1 Number of agents : 16 Connection pool size : 16 Statement cache size : 10 Auto commit : false Sleep time : 0 msec Throttle : - tps Debug mode : false Trace mode : false Log directory : logs_sample09 Parameter 0 : 0 Parameter 1 : 0 Parameter 2 : 0 Parameter 3 : 0 Parameter 4 : 0 Parameter 5 : 0 Parameter 6 : 0 Parameter 7 : 0 Parameter 8 : 0 Parameter 9 : 0 13:16:48 [INFO ] Tiny TPC-B 13:16:48 [INFO ] Scale factor : 16 13:16:48 [INFO ] Truncating history table... 13:16:49 [INFO ] [Warmup] -59 sec, 371 tps, (371 tx) 13:16:50 [INFO ] [Warmup] -58 sec, 649 tps, (1020 tx) 13:16:51 [INFO ] [Warmup] -57 sec, 830 tps, (1850 tx) ... 13:20:46 [INFO ] [Progress] 178 sec, 1013 tps, 178107 tx 13:20:47 [INFO ] [Progress] 179 sec, 970 tps, 179077 tx 13:20:48 [INFO ] [Progress] 180 sec, 984 tps, 180061 tx 13:20:48 [INFO ] [Total tx count] 180061 tx 13:20:48 [INFO ] [Throughput] 1000.3 tps 13:20:48 [INFO ] [Response time (minimum)] 1 msec 13:20:48 [INFO ] [Response time (50%tile)] 16 msec 13:20:48 [INFO ] [Response time (90%tile)] 25 msec 13:20:48 [INFO ] [Response time (95%tile)] 28 msec 13:20:48 [INFO ] [Response time (99%tile)] 35 msec 13:20:48 [INFO ] [Response time (maximum)] 86 msec 13:20:48 [INFO ] < JdbcRunner SUCCESS