TPC-B(TPC Benchmark B)の仕様書の巻末に掲載されているTPC-Bのサンプル実装のコメントを日本語に翻訳しました。たぶん、英文のTPC-Bの仕様書を読むよりも、このベンチマークプログラムのサンプル実装を読むほうが簡単だと思います。
/* * このコードは、TPC-BのANSI CとANSI SQL2によるサンプル実装です。 * このコードと同等な実装であればTPC-Bとして認められます * * 特例: * * 1. ANSI/ISO SQLには、明確な"BEGIN WORK"(トランザクションの開始)がありません。 * ドライバーがトランザクションの外にあることを示すために、 * 明確な"BEGIN WORK"文が含まれています。 * 2. C言語には、整数と浮動小数点数しかなく、精度と桁数を持っていません。 * したがって、この実装では、お金は、整数の貨幣単位で表現されます。 * 3. データベース構造を明確にするために、以下のSQL2の機能が使用されています。 * 主キー * 外部キー * 日付時刻型 * デフォルト値(文字列を埋めるための単純な操作のため) * 4. プログラムを単純にするために、エラーチェックやエラー処理は行っていません。 */ /* グローバル変数の宣言 */ exec sql BEGIN DECLARE SECTION; /* TPC-B スケーリング規則 */ long tps = 1; /* TPS(1秒あたりのトランザクション)のスケーリング数: ここでは1 */ long nbranches = 1; /* 支店数 */ long ntellers = 10; /* 金銭出納係の人数 */ long naccounts = 100000; /* 口座数 */ long nhistory = 864000; /* 履歴レコード数 */ /* 作業記憶域 */ long i,sqlcode, Bid, Tid, Aid, delta, Abalance; exec sql END DECLARE SECTION; void CreateDatabase(); long DoOne(long Bid, long Tid, long Aid, long delta); #include /* メインプログラム 1-tpsデータベースを生成します。すなわち、1支店、10金銭出納係、・・・ * TPC-Bの1トランザクションを実行します。 */ main() { CreateDatabase(); Abalance = DoOne(1,1,1,100); /* 支店1の金銭出納係1の口座1に100を追加し、 新しい預金残高を返します。 */ } /* * CreateDatabase - スケールされたデータベースを作成及び初期化する。 */ void CreateDatabase() { exec sql BEGIN WORK; /* DDLのオプションをカバーするトランザクションの開始 */ /* start trans to cover DDL ops */ exec sql CREATE TABLE branches ( Bid NUMERIC(9), PRIMARY KEY(Bid), Bbalance NUMERIC(10), filler CHAR(88) DEFAULT SYSTEM ); /* 100バイトまで詰める。 */ exec sql CREATE TABLE tellers ( Tid NUMERIC(9), PRIMARY KEY(Tid), Bid NUMERIC(9) FOREIGN KEY REFERENCES branches, Tbalance NUMERIC(10), filler CHAR(84) DEFAULT SYSTEM ); /* 100バイトまで詰める。 */ exec sql CREATE TABLE accounts ( Aid NUMERIC(9), PRIMARY KEY(Aid), Bid NUMERIC(9) FOREIGN KEY REFERENCES branches, Abalance NUMERIC(10), filler CHAR(84) DEFAULT SYSTEM ); /* 100バイトまで詰める。 */ exec sql CREATE TABLE history ( Tid NUMERIC(9) FOREIGN KEY REFERENCES tellers, Bid NUMERIC(9) FOREIGN KEY REFERENCES branches, Aid NUMERIC(9) FOREIGN KEY REFERENCES accounts, delta NUMERIC(10), time TIMESTAMP, filler CHAR(22) DEFAULT SYSTEM ); /* 50バイトまで詰める。 */ /* 主要なデータベースはTPC-Bスケーリング規則を使用します。 * それぞれの支店と金銭出納係に注意してください。 * branch_id = teller_id / ntellers * branch_id = account_id / naccounts */ for (i = 0; i < nbranches*tps; i++) exec sql INSERT INTO branches(Bid,Bbalance) VALUES (:i,0); for (i = 0; i < ntellers*tps; i++) exec sql INSERT INTO tellers(Tid,Bid,Tbalance) VALUES (:i,:i/:ntellers,0); for (i = 0; i < naccounts*tps; i++) exec sql INSERT INTO accounts(Aid,Bid,Abalance) VALUES (:i,:i/:naccounts,0); exec sql COMMIT WORK; } /* CreateDatabase の終了 */ /* * DoOne - TPC-Bの1トランザクションを実行する。 */ long DoOne(long Bid, long Tid, long Aid, long delta) { exec sql BEGIN WORK; exec sql UPDATE accounts SET Abalance = Abalance + :delta WHERE Aid = :Aid; exec sql SELECT Abalance INTO :Abalance FROM accounts WHERE Aid = :Aid; exec sql UPDATE tellers SET Tbalance = Tbalance + :delta WHERE Tid = :Tid; exec sql UPDATE branches SET Bbalance = Bbalance + :delta WHERE Bid = :Bid; exec sql INSERT INTO history(Tid, Bid, Aid, delta, time) VALUES (:Tid, :Bid, :Aid, :delta, CURRENT); exec sql COMMIT WORK; return ( Abalance); } /* DoOne の終了 */