Hello devs,
The attached patch adds minimal stats during the initialization phase.
Such a feature was already submitted by Doug Rady two years ago,
https://commitfest.postgresql.org/15/1308/
but it needed to be adapted to the -I custom initialization approach
developed in the same CF, and it ended 'returned with feedback'.
sh> ./pgbench -i -s 3
dropping old tables...
creating tables...
generating data...
100000 of 300000 tuples (33%) done (elapsed 0.09 s, remaining 0.18 s)
200000 of 300000 tuples (66%) done (elapsed 0.20 s, remaining 0.10 s)
300000 of 300000 tuples (100%) done (elapsed 0.32 s, remaining 0.00 s)
vacuuming...
creating primary keys...
done in 0.68 s (drop 0.06 s, create table 0.02 s, generate 0.34 s, vacuum
0.13 s, primary keys 0.13 s).
See the durations on the last line.
The intent is to test the initialization phase more precisely, and
possibly accelerate it. For instance, is it better to do vacuum before or
after primary keys?
--
Fabien.
diff --git a/src/bin/pgbench/pgbench.c b/src/bin/pgbench/pgbench.c
index 99529de52a..76a5b87fe8 100644
--- a/src/bin/pgbench/pgbench.c
+++ b/src/bin/pgbench/pgbench.c
@@ -3941,32 +3941,48 @@ checkInitSteps(const char *initialize_steps)
static void
runInitSteps(const char *initialize_steps)
{
- PGconn *con;
- const char *step;
+ PQExpBufferData stats;
+ PGconn *con;
+ const char *step;
+ double run_time = 0.0;
+ bool first = true;
+
+ initPQExpBuffer(&stats);
if ((con = doConnect()) == NULL)
exit(1);
for (step = initialize_steps; *step != '\0'; step++)
{
+ instr_time start;
+ char *op = NULL;
+
+ INSTR_TIME_SET_CURRENT(start);
+
switch (*step)
{
case 'd':
+ op = "drop";
initDropTables(con);
break;
case 't':
+ op = "create table";
initCreateTables(con);
break;
case 'g':
+ op = "generate",
initGenerateData(con);
break;
case 'v':
+ op = "vacuum";
initVacuum(con);
break;
case 'p':
+ op = "primary keys";
initCreatePKeys(con);
break;
case 'f':
+ op = "foreign keys";
initCreateFKeys(con);
break;
case ' ':
@@ -3977,10 +3993,28 @@ runInitSteps(const char *initialize_steps)
PQfinish(con);
exit(1);
}
+
+ if (op != NULL)
+ {
+ instr_time diff;
+ double elapsed_sec;
+
+ INSTR_TIME_SET_CURRENT(diff);
+ INSTR_TIME_SUBTRACT(diff, start);
+ elapsed_sec = INSTR_TIME_GET_DOUBLE(diff);
+
+ if (!first)
+ appendPQExpBufferStr(&stats, ", ");
+
+ first = false;
+ appendPQExpBuffer(&stats, "%s %.2f s", op, elapsed_sec);
+ run_time += elapsed_sec;
+ }
}
- fprintf(stderr, "done.\n");
+ fprintf(stderr, "done in %.2f s (%s).\n", run_time, stats.data);
PQfinish(con);
+ termPQExpBuffer(&stats);
}
/*