バージョン: sysbench 1.1
概要
sysbenchはLuaJITに基づくスクリプト可能なマルチスレッドベンチマークツールで、主にデータベースのベンチマークに使用されます。単一ポイントの読み書き、ランダム読み書き、混合読み書きなど、様々な種類のテストをサポートしています。
sysbenchはJDBCを介してデータベースに接続するのではなく、専用のクライアント依存関係を利用します。例えば、MySQLはlibmysqlclientまたはMySQL Connector/Cを使用してデータベース接続を確立し、PostgreSQLはlibpqを使用してPostgreSQLサーバーと通信します。これらのライブラリはSQLクエリの実行とデータベース接続の管理機能を提供し、sysbenchはこれらのクライアントライブラリを利用して事定義されたデータベース操作を実行し、データベースのパフォーマンスと安定性を測定します。
記事目次
-
構文説明
-
パラメータ説明
2.1. 一般パラメータ(オプション)
2.2. テストケースパラメータ(必須)
2.3. データベースパラメータ(必須)
2.4. ログパラメータ(オプション)
2.5. 擬似乱数生成器パラメータ(オプション)
- テスト例
3.1. データ準備
3.2. テスト実行
3.3. データクリーンアップ
3.4. 結果解釈
3.5. コマンドのヒント
- テストタイプのまとめ
4.1. 読み取り性能テスト
① ランダム読み取り性能
② 単一ポイントクエリ
③ ランダムポイントクエリ
④ ランダム範囲クエリ
4.2. 書き込み性能テスト
① ランダム書き込み性能
② 持続的な挿入
③ 持続的な削除
④ インデックス列の更新
⑤ 非インデックス列の更新
4.3. 読み書き混合性能テスト
-
テストクエリの定義
-
構文説明
sysbenchによるデータベーステストは主に「データ準備」、「テスト実行」、「データクリーンアップ」の3つの部分で構成され、以下の構文を使用します:
データ準備(prepare)
sysbench <パラメータオプション> <テストケース> prepare
テスト実行(run)
sysbench <パラメータオプション> <テストケース> run
データクリーンアップ(cleanup)
sysbench <パラメータオプション> <テストケース> cleanup
- パラメータ説明
- 注釈の中波括弧{ }はオプションを、角括弧[ ]はデフォルト値を示します
2.1. 一般パラメータ(オプション)
テストパラメータ
--tables # テーブル数の設定 [1]
--table-size # テーブルの行数 [10000]
--time=N # テスト時間(秒)[10]
--threads=N # スレッド数 [1]
--report-interval=N # 実時レポート間隔(秒)[0]
--db-ps-mode=STRING # プリペアドステートメントの使用 {auto 有効, disable 無効} [auto]
--forced-shutdown=STRING # テスト終了後の強制終了待機時間(秒)[off]
--config-file=FILENAME # コマンドラインを含むファイルの読み込み
特別な説明: --db-ps-modeパラメータはプリペアドステートメント(prepared statements)を使用するかどうかを指定します。有効にするとsysbenchは自動的にデータベースがサポートしているか検出し、サポートしていない場合は通常のステートメントを使用します。例えば、MySQLとPostgreSQLは両方ともプリペアドステートメントを使用してクエリパフォーマンスを最適化でき、実行プロセスで期待されるプリペアドステートメントをローカルにキャッシュし、後続のステートメント再利用時に構文解析、クエリ最適化、プラン生成時間を節約し、全体的なパフォーマンスを向上させることができます。
トランザクション制御パラメータ
--events=N # トランザクション総数の制限 [0] 0は無制限を意味します
--rate=N # 平均トランザクションの制限 [0] 0は無制限を意味します
--thread-stack-size=SIZE # 各スレッドのスタックサイズ [64K]
待機パラメータ
--warmup-time=N # ウォームアップ時間(秒)[0] (ウォームアップ時間は実際のパフォーマンステスト前にシステムが負荷下に置かれる時間帯で、システムが安定状態に達するために使用され、テスト結果をより正確で信頼性の高いものにします)
--thread-init-timeout=N # ワーカースレッド初期化の待機時間(秒)[30]
2.2. テストケースパラメータ(必須)
テストケース設定(--記号は不要)
oltp_read_only # ランダム読み取り性能テスト
oltp_write_only # ランダム書き込み性能テスト
oltp_read_write # 混合読み書き性能テスト
oltp_point_select # 単一ポイントクエリテスト
select_random_points # ランダムポイントクエリテスト
select_random_ranges # ランダム範囲クエリテスト
bulk_insert # バッチ挿入性能テスト
oltp_insert # 持続的挿入性能テスト
oltp_delete # 削除性能テスト
oltp_update_index # 更新操作時のデータベースインデックス性能テスト
oltp_update_non_index # 更新操作時のデータベース非インデックスフィールド性能テスト
2.3. データベースパラメータ(必須)
MySQLパラメータ
--db-driver=mysql # データベースドライバの指定{mysql, mysql} [mysql]
--mysql-host=STRING # データベースIP [localhost]
--mysql-port=N # データベースポート番号 [3306]
--mysql-user=STRING # データベースユーザー名 [root]
--mysql-password=STRING # データベースパスワード []
--mysql-db=STRING # データベース名 [sysbench]
--mysql-sslmode=STRING # SSLモード {disable, allow, prefer, require, verify-ca, verify-full} [disable]
PostgreSQLパラメータ
--db-driver=pgsql # データベースドライバの指定{pgsql, mysql} [mysql]
--pgsql-host=STRING # データベースIP [localhost]
--pgsql-port=N # データベースポート番号 [5432]
--pgsql-user=STRING # データベースユーザー名 [sbtest]
--pgsql-password=STRING # データベースパスワード []
--pgsql-db=STRING # データベース名 [sbtest]
--pgsql-sslmode=STRING # SSLモード (disable, allow, prefer, require, verify-ca, verify-full) [prefer]
--pgsql-sslmodeパラメータオプション説明(--mysql-sslmodeと同じ)
- disable:SSL接続を無効にします。暗号化されていない通常の接続を使用して通信します。
- allow:SSL接続を許可しますが、サーバーがSSLをサポートしない場合は通常の暗号化されていない接続にフォールバックします。
- prefer:SSL接続を優先しますが、サーバーがSSLをサポートしない場合は通常の暗号化されていない接続にフォールバックします。
- require:SSL接続を要求します。サーバーがSSLをサポートしない場合は接続に失敗します。
- verify-ca:SSL接続を要求し、サーバー証明書の有効性を検証します。クライアントはサーバー証明書が信頼できる証明機関(CA)によって署名されているかどうかを検証します。
- verify-full:SSL接続を要求し、サーバー証明書を厳密に検証します。証明書の有効性を検証するだけでなく、サーバー証明書内のホスト名が接続ホスト名と一致するかどうかも検証します。
2.4. ログパラメータ(オプション)
--debug[=on|off] # デバッグ情報の出力 [off]
--verbosity=N # ログレベルの設定 {5:デバッグ情報, 0:重要情報のみ} [3]
--percentile=N # 遅延応答の百分位 [95]
--histogram[=on|off] # ヒストグラムの出力 [off]
2.5. 擬似乱数生成器パラメータ(オプション)
--rand-type=STRING # 乱数の分布タイプ{uniform, gaussian, pareto, zipfian} [uniform]
--rand-seed=N # 乱数生成器のシード(0は現在時刻)[0]
--rand-pareto-h=N # パレト分布のh値の指定、パレト分布の乱数生成に使用 [0.2]
--rand-zipfian-exp=N # ジップファン分布のパラメータの指定、ジップファン分布の乱数生成に使用 [0.8]
- テスト例
3.1. データ準備
PostgreSQLをコンパイルした例として:5つのテーブルを準備し、各テーブルに10万行のデータを挿入します
sysbench \
--db-driver=pgsql \
--pgsql-host=localhost \
--pgsql-password=123456 \
--pgsql-port=54321 \
--pgsql-db=test \
--pgsql-user=system \
--tables=5 \
--table-size=100000 \
--threads=5 \
oltp_read_write \
prepare
挿入プロセス
スクリーンショットからわかるように、データ挿入は4つのステップで構成されています
- スレッドの初期化:--threadsで制御(デフォルト1)、通常はテーブル数と同じに調整します
- テーブルの作成:--tablesで制御(デフォルト1)
- データの挿入:--table-sizeで制御(デフォルト10000)
- インデックスの作成:k列のインデックスを一括作成(テーブルにはid列(主キー)とk列の2つのインデックスがあります)
注意:データ挿入時、どのテストケースを使用しても実際のデータは同じです。例えば
sysbench <パラメータオプション> oltp_read_write prepare sysbench <パラメータオプション> oltp_read_only prepare2つの異なるテストケースを使用してデータを挿入しても、実際のテーブル構造やデータは同じです。
挿入後、データベースで実際の結果を確認できます(sbtestで始まるテーブルが生成されます)
各テーブルの行数は挿入した数と一致します(10万)
テーブルの属性(合計4列、idは主キーインデックス、kは通常インデックス)
3.2. テスト実行
テスト実行のコマンドも非常に簡単で、データ挿入コマンドにテスト時間、実時レポート間隔、スレッド数、テストモードなどの追加パラメータを加えるだけです
sysbench \
--db-driver=pgsql \
--pgsql-host=localhost \
--pgsql-password=123456 \
--pgsql-port=54321 \
--pgsql-db=test \
--pgsql-user=system \
--tables=5 \
--table-size=100000 \
--threads=100 \
--time=5 \
--report-interval=1 \
--db-ps-mode=disable \
oltp_read_write \
run
3.3. データクリーンアップ
データクリーンアップは、データ挿入コマンドのprepareをcleanupに変更するだけです
sysbench \
--db-driver=pgsql \
--pgsql-host=localhost \
--pgsql-password=123456 \
--pgsql-port=54321 \
--pgsql-db=test \
--pgsql-user=system \
--tables=5 \
--table-size=100000 \
--threads=5 \
oltp_read_write \
cleanup
3.4. 結果解釈
sysbenchの組み込みレポートは2つの部分に分かれており、一方は実時レポート、もう一方は最終結果です
【第一部分】実時レポート
[ 1s ] thds: 100 tps: 0.00 qps: 1116.89 (r/w/o: 1017.26/0.00/99.63) lat (ms,95%): 0.00 err/s: 0.00 reconn/s: 0.00
[ 2s ] thds: 100 tps: 56.10 qps: 986.71 (r/w/o: 595.03/285.49/106.18) lat (ms,95%): 1973.38 err/s: 0.00 reconn/s: 0.00
[ 3s ] thds: 100 tps: 57.97 qps: 1460.23 (r/w/o: 1111.42/227.88/120.94) lat (ms,95%): 2009.23 err/s: 0.00 reconn/s: 0.00
[ 4s ] thds: 100 tps: 77.74 qps: 1638.61 (r/w/o: 1132.27/350.85/155.49) lat (ms,95%): 1376.60 err/s: 0.00 reconn/s: 0.00
[ 5s ] thds: 100 tps: 111.39 qps: 1844.43 (r/w/o: 1217.24/405.41/221.77) lat (ms,95%): 4943.53 err/s: 0.00 reconn/s: 0.00
- [ 3s ]:レポート内のデータは過去3秒間で収集されたものです
- thds: 100:現在のテストでは100個のスレッドを使用しています
- tps: 57.97:毎秒実行されたトランザクション数は57.97です。これはデータベースが毎秒処理するトランザクション数を示します
- qps: 1460.23:毎秒実行されたクエリ数は1460.23です。この値には読み取り、書き込み、その他のタイプの操作が含まれます
- (r/w/o: 1111.42/227.88/120.94):クエリの詳細な分布状況を示しています。1111.42個の読み取り操作(r)、227.88個の書き込み操作(w)、および120.94個のその他操作(o)があります
- lat (ms,95%): 2009.23:95%のクエリで最大遅延が2009.23ミリ秒です。このレポートは--percentileで百分位を設定できます
- err/s: 0.00:エラーは発生せず、エラーレートは0です
- reconn/s: 0.00:再接続は発生せず、再接続レートは0です
【第二部分】最終結果
# SQL統計部分
SQL statistics:
queries performed:
read: 5642 # 合計5642回の読み取り操作を実行
write: 1612 # 合計1612回の書き込み操作を実行
other: 806 # 合計806回のその他操作を実行
total: 8060 # 合計8060回の操作を実行
transactions: 403 (67.59 per sec.) # 403個のトランザクションを実行、平均毎秒67.59個のトランザクションを実行
queries: 8060 (1351.90 per sec.) # 8060回のクエリ操作を実行、平均毎秒1351.90回のクエリを実行
ignored errors: 0 (0.00 per sec.) # 0個のエラーを無視、平均毎秒0.00回のエラーが発生
reconnects: 0 (0.00 per sec.) # 再接続回数は0、平均毎秒0.00回の再接続
# トランザクション統計部分
Throughput:
events/s (eps): 67.5948 # 毎秒トランザクション数
time elapsed: 5.9620s # テスト時間
total number of events: 403 # トランザクション総数
# 遅延統計部分
Latency (ms):
min: 352.81 # 最小遅延
avg: 1375.90 # 平均遅延
max: 5408.28 # 最大遅延
95th percentile: 4943.53 # 第95百分位遅延
sum: 554486.87 # 総遅延
# 偏差部分(偏差が大きい場合、各スレッドのイベント実行量の差異が大きいことを意味します;偏差が低い場合、各スレッドの実行量が比較的均一であることを示します)
Threads fairness:
events (avg/stddev): 4.0300/1.82 # 平均各スレッドで4.0300個のイベントを実行、標準偏差は1.82
execution time (avg/stddev): 5.5449/0.15 # 平均実行時間は5.5449秒、標準偏差は0.15秒
3.5. コマンドのヒント
コマンドラインには非常に便利なパラメータ(--config-file)があります。このパラメータは設定ファイルのパスと名前を指定するために使用され、事定義された設定ファイルをロードすることができます。これにより、コマンドラインで大量のパラメータオプションを繰り返し入力する必要がなくなります。例:
これはテスト実行のコマンドです(コマンドが長い)
sysbench --db-driver=pgsql --pgsql-host=localhost --pgsql-password=123456 --pgsql-port=54321 --pgsql-db=kingbase --pgsql-user=system --tables=10 --table-size=10000 --threads=10 --report-interval=1 --time=5 oltp_read_write run
通常、データベース設定とデータ設定は固定されているため、これらのパラメータをファイルに配置できます
vim test.conf
db-driver=pgsql
pgsql-host=localhost
pgsql-password=123456
pgsql-port=54321
pgsql-db=kingbase
pgsql-user=system
実行時にこのファイルを直接読み取り、他の柔軟な設定パラメータを外側に配置するとより便利です
sysbench --config-file=./test.conf --time=5 oltp_read_write run
注意:互換性の問題かバグか不明ですが、ファイル内で設定したtablesとtable-sizeパラメータが有効になりません
- テストタイプのまとめ
4.1. 読み取り性能テスト
① ランダム読み取り性能
テストコマンド(oltp_read_only)
sysbench
--db-driver=pgsql \
--pgsql-host=localhost \
--pgsql-password=123456 \
--pgsql-port=54321 \
--pgsql-db=test \
--pgsql-user=system \
--tables=10 \
--table-size=100000 \
--threads=100 \
--time=600 \
--report-interval=5 \
--db-ps-mode=disable \
oltp_read_only \
run
ソースコード
if not sysbench.opt.skip_trx then
begin()
end
execute_point_selects() // 条件付きクエリ(1つのwhere)
if sysbench.opt.range_selects then
execute_simple_ranges() // 範囲クエリ
execute_sum_ranges() // 範囲クエリ+合計
execute_order_ranges() // 範囲クエリ+ソート
execute_distinct_ranges() // 範囲クエリ+ソート+重複排除
end
if not sysbench.opt.skip_trx then
commit()
end
テストクエリ
BEGIN;
SELECT c FROM sbtest1 WHERE id=$1;
SELECT c FROM sbtest1 WHERE id BETWEEN $1 AND $2;
SELECT SUM(k) FROM sbtest1 WHERE id BETWEEN $1 AND $2;
SELECT c FROM sbtest1 WHERE id BETWEEN $1 AND $2 ORDER BY c;
SELECT DISTINCT c FROM sbtest1 WHERE id BETWEEN $1 AND $2 ORDER BY c;
COMMIT;
② 単一ポイントクエリ
テストコマンド(oltp_point_select)
sysbench
--db-driver=pgsql \
--pgsql-host=localhost \
--pgsql-password=123456 \
--pgsql-port=54321 \
--pgsql-db=test \
--pgsql-user=system \
--tables=10 \
--table-size=100000 \
--threads=100 \
--time=600 \
--report-interval=5 \
--db-ps-mode=disable \
oltp_point_select \
run
ソースコード
function event()
execute_point_selects() // 条件付きクエリ
end
テストクエリ
SELECT c FROM sbtest1 WHERE id=$1;
③ ランダムポイントクエリ
テストコマンド(select_random_points)
sysbench
--db-driver=pgsql \
--pgsql-host=localhost \
--pgsql-password=123456 \
--pgsql-port=54321 \
--pgsql-db=test \
--pgsql-user=system \
--tables=10 \
--table-size=100000 \
--threads=100 \
--time=600 \
--report-interval=5 \
--db-ps-mode=disable \
select_random_points \
run
ソースコード
// k列のINでランダムに10個の値をマッチング
for i = 1, sysbench.opt.random_points do
local rmin = rlen * thread_id
local rmax = rmin + rlen
params[i]:set(sysbench.rand.default(rmin, rmax))
end
テストクエリ
SELECT
id, k, c, pad
FROM
sbtest1
WHERE
k IN ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10);
④ ランダム範囲クエリ
テストコマンド(select_random_ranges)
sysbench
--db-driver=pgsql \
--pgsql-host=localhost \
--pgsql-password=123456 \
--pgsql-port=54321 \
--pgsql-db=test \
--pgsql-user=system \
--tables=10 \
--table-size=100000 \
--threads=100 \
--time=600 \
--report-interval=5 \
--db-ps-mode=disable \
select_random_ranges \
run
ソースコード
// 10個のランダムBETWEEN範囲クエリ
for i = 1, sysbench.opt.number_of_ranges*2, 2 do
local rmin = rlen * thread_id
local rmax = rmin + rlen
local val = sysbench.rand.default(rmin, rmax)
params[i]:set(val)
params[i+1]:set(val + sysbench.opt.delta)
end
テストクエリ
SELECT
count(k)
FROM
sbtest1
WHERE
k BETWEEN $1 AND $2
OR
k BETWEEN $3 AND $4
OR
k BETWEEN $5 AND $6
OR
k BETWEEN $7 AND $8
OR
k BETWEEN $9 AND $10
OR
k BETWEEN $11 AND $12
OR
k BETWEEN $13 AND $14
OR
k BETWEEN $15 AND $16
OR
k BETWEEN $17 AND $18
OR
k BETWEEN $19 AND $20;
4.2. 書き込み性能テスト
① ランダム書き込み性能
テストコマンド(oltp_write_only)
sysbench
--db-driver=pgsql \
--pgsql-host=localhost \
--pgsql-password=123456 \
--pgsql-port=54321 \
--pgsql-db=test \
--pgsql-user=system \
--tables=10 \
--table-size=100000 \
--threads=100 \
--time=600 \
--report-interval=5 \
--db-ps-mode=disable \
oltp_write_only \
run
ソースコード
if not sysbench.opt.skip_trx then
begin()
end
execute_index_updates() // インデックス列の更新
execute_non_index_updates() // 非インデックス列の更新
execute_delete_inserts() // まずdelete、次にinsert
if not sysbench.opt.skip_trx then
commit()
end
テストクエリ
BEGIN;
UPDATE sbtest1 SET k=k+1 WHERE id=$1;
UPDATE sbtest1 SET c=$1 WHERE id=$2;
DELETE FROM sbtest1 WHERE id=$1;
INSERT INTO sbtest1 (id, k, c, pad) VALUES ($1, $2, $3, $4);
COMMIT;
② 持続的な挿入
テストコマンド(oltp_insert)
sysbench
--db-driver=pgsql \
--pgsql-host=localhost \
--pgsql-password=123456 \
--pgsql-port=54321 \
--pgsql-db=test \
--pgsql-user=system \
--tables=10 \
--table-size=100000 \
--threads=100 \
--time=600 \
--report-interval=5 \
--db-ps-mode=disable \
oltp_insert \
run
ソースコード(insertのみ)
local table_name = "sbtest" .. sysbench.rand.uniform(1, sysbench.opt.tables)
local k_val = sysbench.rand.default(1, sysbench.opt.table_size)
local c_val = get_c_value()
local pad_val = get_pad_value()
con:query(
string.format(
"INSERT INTO %s (k, c, pad) VALUES " "(%d, '%s', '%s')", table_name, k_val, c_val, pad_val))
テストクエリ
INSERT INTO
sbtest1 (k, c, pad)
VALUES
($1, $2, $3);
③ 持続的な削除
テストコマンド(oltp_delete)
sysbench
--db-driver=pgsql \
--pgsql-host=localhost \
--pgsql-password=123456 \
--pgsql-port=54321 \
--pgsql-db=test \
--pgsql-user=system \
--tables=10 \
--table-size=100000 \
--threads=100 \
--time=600 \
--report-interval=5 \
--db-ps-mode=disable \
oltp_delete \
run
ソースコード(deleteのみ)
local tnum = sysbench.rand.uniform(1, sysbench.opt.tables)
local id = sysbench.rand.default(1, sysbench.opt.table_size)
param[tnum].deletes[1]:set(id)
stmt[tnum].deletes:execute()
テストクエリ
DELETE FROM sbtest1 WHERE id=$1;
④ インデックス列の更新
テストコマンド(oltp_update_index)
sysbench
--db-driver=pgsql \
--pgsql-host=localhost \
--pgsql-password=123456 \
--pgsql-port=54321 \
--pgsql-db=test \
--pgsql-user=system \
--tables=10 \
--table-size=100000 \
--threads=100 \
--time=600 \
--report-interval=5 \
--db-ps-mode=disable \
oltp_update_index \
run
ソースコード(インデックス列"k列"の更新のみ)
execute_index_updates(con)
テストクエリ
UPDATE sbtest1 SET k=k+1 WHERE id=$1
⑤ 非インデックス列の更新
テストコマンド(oltp_update_non_index)
sysbench
--db-driver=pgsql \
--pgsql-host=localhost \
--pgsql-password=123456 \
--pgsql-port=54321 \
--pgsql-db=test \
--pgsql-user=system \
--tables=10 \
--table-size=100000 \
--threads=100 \
--time=600 \
--report-interval=5 \
--db-ps-mode=disable \
oltp_update_non_index \
run
ソースコード(非インデックス列"c列"の更新のみ)
execute_non_index_updates()
テストクエリ
UPDATE sbtest1 SET c=$1 WHERE id=$2;
4.3. 読み書き混合性能テスト
テストコマンド(oltp_read_write)
sysbench
--db-driver=pgsql \
--pgsql-host=localhost \
--pgsql-password=123456 \
--pgsql-port=54321 \
--pgsql-db=test \
--pgsql-user=system \
--tables=10 \
--table-size=100000 \
--threads=100 \
--time=600 \
--report-interval=5 \
--db-ps-mode=disable \
oltp_read_write \
run
ソースコード(実際にはread_only + write_only)
if not sysbench.opt.skip_trx then
begin()
end
execute_point_selects() // 単一ポイントwhere条件クエリ
if sysbench.opt.range_selects then
execute_simple_ranges() // 範囲クエリ
execute_sum_ranges() // 範囲クエリ+合計
execute_order_ranges() // 範囲クエリ+ソート
execute_distinct_ranges() // 範囲クエリ+ソート+重複排除
end
execute_index_updates() // インデックス列の更新
execute_non_index_updates() // 非インデックス列の更新
execute_delete_inserts() // まずdelete、次にinsert
if not sysbench.opt.skip_trx then
commit()
end
テストクエリ
BEGIN;
SELECT c FROM sbtest1 WHERE id=$1;
SELECT c FROM sbtest1 WHERE id BETWEEN $1 AND $2;
SELECT SUM(k) FROM sbtest1 WHERE id BETWEEN $1 AND $2;
SELECT c FROM sbtest1 WHERE id BETWEEN $1 AND $2 ORDER BY c;
SELECT DISTINCT c FROM sbtest1 WHERE id BETWEEN $1 AND $2 ORDER BY c;
UPDATE sbtest1 SET k=k+1 WHERE id=$1;
UPDATE sbtest1 SET c=$1 WHERE id=$2;
DELETE FROM sbtest1 WHERE id=$1;
INSERT INTO sbtest1 (id, k, c, pad) VALUES ($1, $2, $3, $4);
COMMIT;
- テストクエリの定義
ソースコードは以下の通りです
local stmt_defs = {
point_selects = {
"SELECT c FROM sbtest%u WHERE id=?",
t.INT},
simple_ranges = {
"SELECT c FROM sbtest%u WHERE id BETWEEN ? AND ?",
t.INT, t.INT},
sum_ranges = {
"SELECT SUM(k) FROM sbtest%u WHERE id BETWEEN ? AND ?",
t.INT, t.INT},
order_ranges = {
"SELECT c FROM sbtest%u WHERE id BETWEEN ? AND ? ORDER BY c",
t.INT, t.INT},
distinct_ranges = {
"SELECT DISTINCT c FROM sbtest%u WHERE id BETWEEN ? AND ? ORDER BY c",
t.INT, t.INT},
index_updates = {
"UPDATE sbtest%u SET k=k+1 WHERE id=?",
t.INT},
non_index_updates = {
"UPDATE sbtest%u SET c=? WHERE id=?",
{t.CHAR, 120}, t.INT},
deletes = {
"DELETE FROM sbtest%u WHERE id=?",
t.INT},
inserts = {
"INSERT INTO sbtest%u (id, k, c, pad) VALUES (?, ?, ?, ?)",
t.INT, t.INT, {t.CHAR, 120}, {t.CHAR, 60}},
}