Commit a1c935d3 authored by Alvaro Herrera's avatar Alvaro Herrera

pgbench: allow a script weight of zero

This refines the previous weight range and allows a script to be "turned
off" by passing a zero weight, which is useful when scripting multiple
pgbench runs.

I did not apply the suggested warning when a script uses zero weight; we
use the principle elsewhere that if there's nothing to be done, do
nothing quietly.

Adjust docs accordingly.

Author: Jeff Janes, Fabien Coelho
parent ad956647
...@@ -698,6 +698,7 @@ pgbench <optional> <replaceable>options</> </optional> <replaceable>dbname</> ...@@ -698,6 +698,7 @@ pgbench <optional> <replaceable>options</> </optional> <replaceable>dbname</>
Each script may be given a relative weight specified after a Each script may be given a relative weight specified after a
<literal>@</> so as to change its drawing probability. <literal>@</> so as to change its drawing probability.
The default weight is <literal>1</>. The default weight is <literal>1</>.
Scripts with a weight of <literal>0</> are ignored.
</para> </para>
<para> <para>
...@@ -1259,17 +1260,17 @@ tps = 618.764555 (including connections establishing) ...@@ -1259,17 +1260,17 @@ tps = 618.764555 (including connections establishing)
tps = 622.977698 (excluding connections establishing) tps = 622.977698 (excluding connections establishing)
script statistics: script statistics:
- statement latencies in milliseconds: - statement latencies in milliseconds:
0.002522 \set aid random(1, 100000 * :scale) 0.002 \set aid random(1, 100000 * :scale)
0.005459 \set bid random(1, 1 * :scale) 0.005 \set bid random(1, 1 * :scale)
0.002348 \set tid random(1, 10 * :scale) 0.002 \set tid random(1, 10 * :scale)
0.001078 \set delta random(-5000, 5000) 0.001 \set delta random(-5000, 5000)
0.326152 BEGIN; 0.326 BEGIN;
0.603376 UPDATE pgbench_accounts SET abalance = abalance + :delta WHERE aid = :aid; 0.603 UPDATE pgbench_accounts SET abalance = abalance + :delta WHERE aid = :aid;
0.454643 SELECT abalance FROM pgbench_accounts WHERE aid = :aid; 0.454 SELECT abalance FROM pgbench_accounts WHERE aid = :aid;
5.528491 UPDATE pgbench_tellers SET tbalance = tbalance + :delta WHERE tid = :tid; 5.528 UPDATE pgbench_tellers SET tbalance = tbalance + :delta WHERE tid = :tid;
7.335435 UPDATE pgbench_branches SET bbalance = bbalance + :delta WHERE bid = :bid; 7.335 UPDATE pgbench_branches SET bbalance = bbalance + :delta WHERE bid = :bid;
0.371851 INSERT INTO pgbench_history (tid, bid, aid, delta, mtime) VALUES (:tid, :bid, :aid, :delta, CURRENT_TIMESTAMP); 0.371 INSERT INTO pgbench_history (tid, bid, aid, delta, mtime) VALUES (:tid, :bid, :aid, :delta, CURRENT_TIMESTAMP);
1.212976 END; 1.212 END;
</screen> </screen>
</para> </para>
......
...@@ -3054,10 +3054,10 @@ parseScriptWeight(const char *option, char **script) ...@@ -3054,10 +3054,10 @@ parseScriptWeight(const char *option, char **script)
fprintf(stderr, "invalid weight specification: %s\n", sep); fprintf(stderr, "invalid weight specification: %s\n", sep);
exit(1); exit(1);
} }
if (wtmp > INT_MAX || wtmp <= 0) if (wtmp > INT_MAX || wtmp < 0)
{ {
fprintf(stderr, fprintf(stderr,
"weight specification out of range (1 .. %u): " INT64_FORMAT "\n", "weight specification out of range (0 .. %u): " INT64_FORMAT "\n",
INT_MAX, (int64) wtmp); INT_MAX, (int64) wtmp);
exit(1); exit(1);
} }
...@@ -3181,10 +3181,11 @@ printResults(TState *threads, StatsData *total, instr_time total_time, ...@@ -3181,10 +3181,11 @@ printResults(TState *threads, StatsData *total, instr_time total_time,
{ {
if (num_scripts > 1) if (num_scripts > 1)
printf("SQL script %d: %s\n" printf("SQL script %d: %s\n"
" - weight = %d\n" " - weight = %d (targets %.1f%% of total)\n"
" - " INT64_FORMAT " transactions (%.1f%% of total, tps = %f)\n", " - " INT64_FORMAT " transactions (%.1f%% of total, tps = %f)\n",
i + 1, sql_script[i].desc, i + 1, sql_script[i].desc,
sql_script[i].weight, sql_script[i].weight,
100.0 * sql_script[i].weight / total_weight,
sql_script[i].stats.cnt, sql_script[i].stats.cnt,
100.0 * sql_script[i].stats.cnt / total->cnt, 100.0 * sql_script[i].stats.cnt / total->cnt,
sql_script[i].stats.cnt / time_include); sql_script[i].stats.cnt / time_include);
...@@ -3628,6 +3629,12 @@ main(int argc, char **argv) ...@@ -3628,6 +3629,12 @@ main(int argc, char **argv)
/* cannot overflow: weight is 32b, total_weight 64b */ /* cannot overflow: weight is 32b, total_weight 64b */
total_weight += sql_script[i].weight; total_weight += sql_script[i].weight;
if (total_weight == 0 && !is_init_mode)
{
fprintf(stderr, "total script weight must not be zero\n");
exit(1);
}
/* show per script stats if several scripts are used */ /* show per script stats if several scripts are used */
if (num_scripts > 1) if (num_scripts > 1)
per_script_stats = true; per_script_stats = true;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment