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);
 }
 
 /*

Reply via email to