Minor improvements in Incremental Sort explain
authorTomas Vondra
Tue, 7 Apr 2020 16:03:24 +0000 (18:03 +0200)
committerTomas Vondra
Tue, 7 Apr 2020 16:25:13 +0000 (18:25 +0200)
Some places still used "Maximum" instead of "Peak" when displaying info
about sort space, so fix that. Also, add a comment clarifying why it's
correct to check the number of full/prefix sort groups.

Author: James Coleman
Discussion: https://postgr.es/m/CAPpHfds1waRZ=NOmueYq0sx1ZSCnt+5QJvizT8ndT2=etZEeAQ@mail.gmail.com

src/backend/commands/explain.c
src/test/regress/expected/incremental_sort.out
src/test/regress/sql/incremental_sort.sql

index baaa5817af727731851185f5c0de7dd08f1fa52a..455f54ef83feb44a47cb95fb16b12ee39b561ea0 100644 (file)
@@ -2841,7 +2841,7 @@ show_incremental_sort_group_info(IncrementalSortGroupInfo *groupInfo,
            ExplainOpenGroup("Sort Space", memoryName.data, true, es);
 
            ExplainPropertyInteger("Average Sort Space Used", "kB", avgSpace, es);
-           ExplainPropertyInteger("Maximum Sort Space Used", "kB",
+           ExplainPropertyInteger("Peak Sort Space Used", "kB",
                                   groupInfo->maxMemorySpaceUsed, es);
 
            ExplainCloseGroup("Sort Spaces", memoryName.data, true, es);
@@ -2858,7 +2858,7 @@ show_incremental_sort_group_info(IncrementalSortGroupInfo *groupInfo,
            ExplainOpenGroup("Sort Space", diskName.data, true, es);
 
            ExplainPropertyInteger("Average Sort Space Used", "kB", avgSpace, es);
-           ExplainPropertyInteger("Maximum Sort Space Used", "kB",
+           ExplainPropertyInteger("Peak Sort Space Used", "kB",
                                   groupInfo->maxDiskSpaceUsed, es);
 
            ExplainCloseGroup("Sort Spaces", diskName.data, true, es);
@@ -2883,6 +2883,15 @@ show_incremental_sort_info(IncrementalSortState *incrsortstate,
    if (!es->analyze)
        return;
 
+   /*
+    * Since we never have any prefix groups unless we've first sorted a full
+    * groups and transitioned modes (copying the tuples into a prefix group),
+    * we don't need to do anything if there were 0 full groups.
+    *
+    * We still have to continue after this block if there are no full groups,
+    * though, since it's possible that we have workers that did real work even
+    * if the leader didn't participate.
+    */
    if (fullsortGroupInfo->groupCount > 0)
    {
        show_incremental_sort_group_info(fullsortGroupInfo, "Full-sort", true, es);
@@ -2914,6 +2923,13 @@ show_incremental_sort_info(IncrementalSortState *incrsortstate,
             */
            fullsortGroupInfo = &incsort_info->fullsortGroupInfo;
            prefixsortGroupInfo = &incsort_info->prefixsortGroupInfo;
+
+           /*
+            * Since we never have any prefix groups unless we've first sorted
+            * a full groups and transitioned modes (copying the tuples into a
+            * prefix group), we don't need to do anything if there were 0 full
+            * groups.
+            */
            if (fullsortGroupInfo->groupCount == 0 &&
                prefixsortGroupInfo->groupCount == 0)
                continue;
index d32b774c5518bae88b2020763eef80fb33224bdf..3072d956437a55259fdd7705140b48fe8548ad61 100644 (file)
@@ -109,7 +109,7 @@ begin
     for group_key in select unnest(array['Full-sort Groups', 'Presorted Groups']::text[]) t loop
       for space_key in select unnest(array['Sort Space Memory', 'Sort Space Disk']::text[]) t loop
         node := jsonb_set(node, array[group_key, space_key, 'Average Sort Space Used'], '"NN"', false);
-        node := jsonb_set(node, array[group_key, space_key, 'Maximum Sort Space Used'], '"NN"', false);
+        node := jsonb_set(node, array[group_key, space_key, 'Peak Sort Space Used'], '"NN"', false);
       end loop;
     end loop;
     nodes := nodes || node;
@@ -131,7 +131,7 @@ begin
     for group_key in select unnest(array['Full-sort Groups', 'Presorted Groups']::text[]) t loop
       group_stats := node->group_key;
       for space_key in select unnest(array['Sort Space Memory', 'Sort Space Disk']::text[]) t loop
-        if (group_stats->space_key->'Maximum Sort Space Used')::bigint < (group_stats->space_key->'Maximum Sort Space Used')::bigint then
+        if (group_stats->space_key->'Peak Sort Space Used')::bigint < (group_stats->space_key->'Peak Sort Space Used')::bigint then
           raise exception '% has invalid max space < average space', group_key;
         end if;
       end loop;
@@ -545,34 +545,34 @@ select explain_analyze_without_memory('select * from (select * from t order by a
 (9 rows)
 
 select jsonb_pretty(explain_analyze_inc_sort_nodes_without_memory('select * from (select * from t order by a) s order by a, b limit 55'));
-                   jsonb_pretty                   
---------------------------------------------------
- [                                               +
-     {                                           +
-         "Sort Key": [                           +
-             "t.a",                              +
-             "t.b"                               +
-         ],                                      +
-         "Node Type": "Incremental Sort",        +
-         "Actual Rows": 55,                      +
-         "Actual Loops": 1,                      +
-         "Presorted Key": [                      +
-             "t.a"                               +
-         ],                                      +
-         "Parallel Aware": false,                +
-         "Full-sort Groups": {                   +
-             "Group Count": 2,                   +
-             "Sort Methods Used": [              +
-                 "top-N heapsort",               +
-                 "quicksort"                     +
-             ],                                  +
-             "Sort Space Memory": {              +
-                 "Average Sort Space Used": "NN",+
-                 "Maximum Sort Space Used": "NN" +
-             }                                   +
-         },                                      +
-         "Parent Relationship": "Outer"          +
-     }                                           +
+                  jsonb_pretty                   
+-------------------------------------------------
+ [                                              +
+     {                                          +
+         "Sort Key": [                          +
+             "t.a",                             +
+             "t.b"                              +
+         ],                                     +
+         "Node Type": "Incremental Sort",       +
+         "Actual Rows": 55,                     +
+         "Actual Loops": 1,                     +
+         "Presorted Key": [                     +
+             "t.a"                              +
+         ],                                     +
+         "Parallel Aware": false,               +
+         "Full-sort Groups": {                  +
+             "Group Count": 2,                  +
+             "Sort Methods Used": [             +
+                 "top-N heapsort",              +
+                 "quicksort"                    +
+             ],                                 +
+             "Sort Space Memory": {             +
+                 "Peak Sort Space Used": "NN",  +
+                 "Average Sort Space Used": "NN"+
+             }                                  +
+         },                                     +
+         "Parent Relationship": "Outer"         +
+     }                                          +
  ]
 (1 row)
 
@@ -719,43 +719,43 @@ select explain_analyze_without_memory('select * from (select * from t order by a
 (9 rows)
 
 select jsonb_pretty(explain_analyze_inc_sort_nodes_without_memory('select * from (select * from t order by a) s order by a, b limit 70'));
-                   jsonb_pretty                   
---------------------------------------------------
- [                                               +
-     {                                           +
-         "Sort Key": [                           +
-             "t.a",                              +
-             "t.b"                               +
-         ],                                      +
-         "Node Type": "Incremental Sort",        +
-         "Actual Rows": 70,                      +
-         "Actual Loops": 1,                      +
-         "Presorted Key": [                      +
-             "t.a"                               +
-         ],                                      +
-         "Parallel Aware": false,                +
-         "Full-sort Groups": {                   +
-             "Group Count": 1,                   +
-             "Sort Methods Used": [              +
-                 "quicksort"                     +
-             ],                                  +
-             "Sort Space Memory": {              +
-                 "Average Sort Space Used": "NN",+
-                 "Maximum Sort Space Used": "NN" +
-             }                                   +
-         },                                      +
-         "Presorted Groups": {                   +
-             "Group Count": 5,                   +
-             "Sort Methods Used": [              +
-                 "quicksort"                     +
-             ],                                  +
-             "Sort Space Memory": {              +
-                 "Average Sort Space Used": "NN",+
-                 "Maximum Sort Space Used": "NN" +
-             }                                   +
-         },                                      +
-         "Parent Relationship": "Outer"          +
-     }                                           +
+                  jsonb_pretty                   
+-------------------------------------------------
+ [                                              +
+     {                                          +
+         "Sort Key": [                          +
+             "t.a",                             +
+             "t.b"                              +
+         ],                                     +
+         "Node Type": "Incremental Sort",       +
+         "Actual Rows": 70,                     +
+         "Actual Loops": 1,                     +
+         "Presorted Key": [                     +
+             "t.a"                              +
+         ],                                     +
+         "Parallel Aware": false,               +
+         "Full-sort Groups": {                  +
+             "Group Count": 1,                  +
+             "Sort Methods Used": [             +
+                 "quicksort"                    +
+             ],                                 +
+             "Sort Space Memory": {             +
+                 "Peak Sort Space Used": "NN",  +
+                 "Average Sort Space Used": "NN"+
+             }                                  +
+         },                                     +
+         "Presorted Groups": {                  +
+             "Group Count": 5,                  +
+             "Sort Methods Used": [             +
+                 "quicksort"                    +
+             ],                                 +
+             "Sort Space Memory": {             +
+                 "Peak Sort Space Used": "NN",  +
+                 "Average Sort Space Used": "NN"+
+             }                                  +
+         },                                     +
+         "Parent Relationship": "Outer"         +
+     }                                          +
  ]
 (1 row)
 
index 2ba5d7a67d1027d0305bd0378cb85c226ba437bb..e78a96d5bf03ae0545fee0fbf93880e673439bf2 100644 (file)
@@ -85,7 +85,7 @@ begin
     for group_key in select unnest(array['Full-sort Groups', 'Presorted Groups']::text[]) t loop
       for space_key in select unnest(array['Sort Space Memory', 'Sort Space Disk']::text[]) t loop
         node := jsonb_set(node, array[group_key, space_key, 'Average Sort Space Used'], '"NN"', false);
-        node := jsonb_set(node, array[group_key, space_key, 'Maximum Sort Space Used'], '"NN"', false);
+        node := jsonb_set(node, array[group_key, space_key, 'Peak Sort Space Used'], '"NN"', false);
       end loop;
     end loop;
     nodes := nodes || node;
@@ -108,7 +108,7 @@ begin
     for group_key in select unnest(array['Full-sort Groups', 'Presorted Groups']::text[]) t loop
       group_stats := node->group_key;
       for space_key in select unnest(array['Sort Space Memory', 'Sort Space Disk']::text[]) t loop
-        if (group_stats->space_key->'Maximum Sort Space Used')::bigint < (group_stats->space_key->'Maximum Sort Space Used')::bigint then
+        if (group_stats->space_key->'Peak Sort Space Used')::bigint < (group_stats->space_key->'Peak Sort Space Used')::bigint then
           raise exception '% has invalid max space < average space', group_key;
         end if;
       end loop;