From: | Matthias van de Meent <boekewurm+postgres(at)gmail(dot)com> |
---|---|
To: | Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> |
Cc: | stepan rutz <stepan(dot)rutz(at)gmx(dot)de>, Tomas Vondra <tomas(dot)vondra(at)enterprisedb(dot)com>, pgsql-hackers(at)postgresql(dot)org |
Subject: | Re: Detoasting optionally to make Explain-Analyze less misleading |
Date: | 2024-04-03 16:59:40 |
Message-ID: | CAEze2WhopAFRS4xdNtma6XtYCRqydPWAg83jx8HZTowpeXzOyg@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
On Tue, 2 Apr 2024 at 17:47, Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> wrote:
>
> Matthias van de Meent <boekewurm+postgres(at)gmail(dot)com> writes:
> > Attached is v9, which is rebased on master to handle 24eebc65's
> > changed signature of pq_sendcountedtext.
> > It now also includes autocompletion, and a second patch which adds
> > documentation to give users insights into this new addition to
> > EXPLAIN.
>
> I took a quick look through this. Some comments in no particular
> order:
Thanks!
> Documentation is not optional, so I don't really see the point of
> splitting this into two patches.
I've seen the inverse several times, but I've merged them in the
attached version 10.
> IIUC, it's not possible to use the SERIALIZE option when explaining
> CREATE TABLE AS, because you can't install the instrumentation tuple
> receiver when the IntoRel one is needed. I think that's fine because
> no serialization would happen in that case anyway, but should we
> throw an error if that combination is requested? Blindly reporting
> that zero bytes were serialized seems like it'd confuse people.
I think it's easily explained as no rows were transfered to the
client. If there is actual confusion, we can document it, but
confusing disk with network is not a case I'd protect against. See
also: EXPLAIN (ANALYZE, SERIALIZE) INSERT without the RETURNING
clause.
> I'd lose the stuff about measuring memory consumption. Nobody asked
> for that and the total is completely misleading, because in reality
> we'll reclaim the memory used after each row. It would allow cutting
> the text-mode output down to one line, too, instead of having your
> own format that's not like anything else.
Done.
> I thought the upthread agreement was to display the amount of
> data sent rounded to kilobytes, so why is the code displaying
> an exact byte count?
Probably it was because the other explain code I referenced was using
bytes in the json/yaml format. Fixed.
> I don't especially care for magic numbers like these:
>
> + /* see printtup.h why we add 18 bytes here. These are the infos
> + * needed for each attribute plus the attribute's name */
> + receiver->metrics.bytesSent += (int64) namelen + 1 + 18;
>
> If the protocol is ever changed in a way that invalidates this,
> there's about 0 chance that somebody would remember to touch
> this code.
> However, isn't the bottom half of serializeAnalyzeStartup doing
> exactly what the comment above it says we don't do, that is accounting
> for the RowDescription message? Frankly I agree with the comment that
> it's not worth troubling over, so I'd just drop that code rather than
> finding a solution for the magic-number problem.
In the comment above I intended to explain that it takes negligible
time to serialize the RowDescription message (when compared to all
other tasks of explain), so skipping the actual writing of the message
would be fine.
I'm not sure I agree with not including the size of RowDescription
itself though, as wide results can have a very large RowDescription
overhead; up to several times the returned data in cases where few
rows are returned.
Either way, I've removed that part of the code.
> Don't bother with duplicating valgrind-related logic in
> serializeAnalyzeReceive --- that's irrelevant to actual users.
Removed. I've instead added buffer usage, as I realised that wasn't
covered yet, and quite important to detect excessive detoasting (it's
not covered at the top-level scan).
> This seems like cowboy coding:
>
> + self->destRecevier.mydest = DestNone;
>
> You should define a new value of the CommandDest enum and
> integrate this receiver type into the support functions
> in dest.c.
Done.
> BTW, "destRecevier" is misspelled...
Thanks, fixed.
Kind regards,
Matthias van de Meent.
Attachment | Content-Type | Size |
---|---|---|
v10-0001-Explain-Add-SERIALIZE-option.patch | application/octet-stream | 29.9 KB |
From | Date | Subject | |
---|---|---|---|
Next Message | Bharath Rupireddy | 2024-04-03 17:00:00 | Re: LogwrtResult contended spinlock |
Previous Message | Alvaro Herrera | 2024-04-03 16:55:35 | Re: [HACKERS] make async slave to wait for lsn to be replayed |