• Tom Lane's avatar
    Clean up EXPLAIN's handling of per-worker details. · 10013684
    Tom Lane authored
    Previously, it was possible for EXPLAIN ANALYZE of a parallel query
    to produce several different "Workers" fields for a single plan node,
    because different portions of explain.c independently generated
    per-worker data and wrapped that output in separate fields.  This
    is pretty bogus, especially for the structured output formats: even
    if it's not technically illegal, most programs would have a hard time
    dealing with such data.
    
    To improve matters, add infrastructure that allows redirecting
    per-worker values into a side data structure, and then collect that
    data into a single "Workers" field after we've finished running all
    the relevant code for a given plan node.
    
    There are a few visible side-effects:
    
    * In text format, instead of something like
    
      Sort Method: external merge  Disk: 4920kB
      Worker 0:  Sort Method: external merge  Disk: 5880kB
      Worker 1:  Sort Method: external merge  Disk: 5920kB
      Buffers: shared hit=682 read=10188, temp read=1415 written=2101
      Worker 0:  actual time=130.058..130.324 rows=1324 loops=1
        Buffers: shared hit=337 read=3489, temp read=505 written=739
      Worker 1:  actual time=130.273..130.512 rows=1297 loops=1
        Buffers: shared hit=345 read=3507, temp read=505 written=744
    
    you get
    
      Sort Method: external merge  Disk: 4920kB
      Buffers: shared hit=682 read=10188, temp read=1415 written=2101
      Worker 0:  actual time=130.058..130.324 rows=1324 loops=1
        Sort Method: external merge  Disk: 5880kB
        Buffers: shared hit=337 read=3489, temp read=505 written=739
      Worker 1:  actual time=130.273..130.512 rows=1297 loops=1
        Sort Method: external merge  Disk: 5920kB
        Buffers: shared hit=345 read=3507, temp read=505 written=744
    
    * When JIT is enabled, any relevant per-worker JIT stats are attached
    to the child node of the Gather or Gather Merge node, which is where
    the other per-worker output has always been.  Previously, that info
    was attached directly to a Gather node, or missed entirely for Gather
    Merge.
    
    * A query's summary JIT data no longer includes a bogus
    "Worker Number: -1" field.
    
    A notable code-level change is that indenting for lines of text-format
    output should now be handled by calling "ExplainIndentText(es)",
    instead of hard-wiring how much space to emit.  This seems a good deal
    cleaner anyway.
    
    This patch also adds a new "explain.sql" regression test script that's
    dedicated to testing EXPLAIN.  There is more that can be done in that
    line, certainly, but for now it just adds some coverage of the XML and
    YAML output formats, which had been completely untested.
    
    Although this is surely a bug fix, it's not clear that people would
    be happy with rearranging EXPLAIN output in a minor release, so apply
    to HEAD only.
    
    Maciek Sakrejda and Tom Lane, based on an idea of Andres Freund's;
    reviewed by Georgios Kokolatos
    
    Discussion: https://postgr.es/m/CAOtHd0AvAA8CLB9Xz0wnxu1U=zJCKrr1r4QwwXi_kcQsHDVU=Q@mail.gmail.com
    10013684
explain.h 4.67 KB