Re: [PATCH] Add extra statistics to explain for Nested Loop - Mailing list pgsql-hackers

From Julien Rouhaud
Subject Re: [PATCH] Add extra statistics to explain for Nested Loop
Date
Msg-id 20220307050830.zahd57wbvezu2d6r@jrouhaud
Whole thread Raw
In response to Re: [PATCH] Add extra statistics to explain for Nested Loop  (Ekaterina Sokolova <e.sokolova@postgrespro.ru>)
List pgsql-hackers
Hi,

On Thu, Feb 03, 2022 at 12:59:03AM +0300, Ekaterina Sokolova wrote:
>
> I apply the new version of patch.
>
> I wanted to measure overheads, but could't choose correct way. Thanks for
> idea with auto_explain.
> I loaded it and made 10 requests of pgbench (number of clients: 1, of
> threads: 1).
> I'm not sure I chose the right way to measure overhead, so any suggestions
> are welcome.
> Current results are in file overhead_v0.txt.
>
> Please feel free to share your suggestions and comments. Regards,
>

>    | master latency (ms) | master tps |  | new latency (ms) |   new tps
> --------------------------------------------------------------------------
>  1 |        2,462        | 406,190341 |  |       4,485      | 222,950527
>  2 |        3,877        | 257,89813  |  |       4,141      | 241,493395
>  3 |        3,789        | 263,935811 |  |       2,837      | 352,522297
>  4 |        3,53         | 283,310196 |  |       5,510      | 181,488203
>  5 |        3,413        | 292,997363 |  |       6,475      | 154,432999
>  6 |        3,757        | 266,148564 |  |       4,073      | 245,507218
>  7 |        3,752        | 266,560043 |  |       3,901      | 256,331385
>  8 |        4,389        | 227,847524 |  |       4,658      | 214,675196
>  9 |        4,341        | 230,372282 |  |       4,220      | 236,983672
> 10 |        3,893        | 256,891104 |  |       7.059      | 141,667139
> --------------------------------------------------------------------------
> avg|        3,7203       | 275,215136 |  |       4,03       | 224,8052031
>
>
> master/new latency | 0,92315 |
> master/new tps     | 1,22424 |
>
> new/master latency | 1,08325 |
> new/master tps     | 0,81683 |

The overhead is quite significant (at least for OLTP-style workload).

I think this should be done with a new InstrumentOption, like
INSTRUMENT_LOOP_DETAILS or something like that, and set it where appropriate.
Otherwise you will have to pay that overhead even if you won't use the new
fields at all.  It could be EXPLAIN (ANALYZE, VERBOSE OFF), but also simply
using pg_stat_statements which doesn't seem acceptable.

One problem is that some extensions (like pg_stat_statements) can rely on
INSTRUMENT_ALL but may or may not care about those extra counters.  Maybe we
should remove that alias and instead provide two (like INSTRUMENT_ALL_VERBOSE
and INSTRUMENT_ALL_SOMETHINGELSE, I don't have any bright name right now) so
that authors can decide what they need instead of silently having such
extension ruin the performance for no reason.

About the implementation itself:

+static void show_loop_info(Instrumentation *instrument, bool isworker,
+                          ExplainState *es);

I think this should be done as a separate refactoring commit.

+   /*
+    * this is first loop
+    *
+    * We only initialize the min values. We don't need to bother with the
+    * max, because those are 0 and the non-zero values will get updated a
+    * couple lines later.
+    */
+   if (instr->nloops == 0)
+   {
+       instr->min_t = totaltime;
+       instr->min_tuples = instr->tuplecount;
+   }
+
+   if (instr->min_t > totaltime)
+       instr->min_t = totaltime;
+
+   if (instr->max_t < totaltime)
+       instr->max_t = totaltime;
+
    instr->ntuples += instr->tuplecount;
+
+   if (instr->min_tuples > instr->tuplecount)
+       instr->min_tuples = instr->tuplecount;
+
+   if (instr->max_tuples < instr->tuplecount)
+       instr->max_tuples = instr->tuplecount;
+
    instr->nloops += 1;

Why do you need to initialize min_t and min_tuples but not max_t and
max_tuples while both will initially be 0 and possibly updated afterwards?

I think you should either entirely remove this if (instr->nloops == 0) part, or
handle some else block.



pgsql-hackers by date:

Previous
From: Peter Smith
Date:
Subject: Re: Handle infinite recursion in logical replication setup
Next
From: vignesh C
Date:
Subject: Re: Handle infinite recursion in logical replication setup