From d22782a5392f6a1cb6cfca34031b93eb9dd2aa03 Mon Sep 17 00:00:00 2001 From: Tomas Vondra Date: Tue, 7 Apr 2020 18:03:24 +0200 Subject: [PATCH] Minor improvements in Incremental Sort explain 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 | 20 ++- .../regress/expected/incremental_sort.out | 134 +++++++++--------- src/test/regress/sql/incremental_sort.sql | 4 +- 3 files changed, 87 insertions(+), 71 deletions(-) diff --git a/src/backend/commands/explain.c b/src/backend/commands/explain.c index baaa5817af..455f54ef83 100644 --- a/src/backend/commands/explain.c +++ b/src/backend/commands/explain.c @@ -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; diff --git a/src/test/regress/expected/incremental_sort.out b/src/test/regress/expected/incremental_sort.out index d32b774c55..3072d95643 100644 --- a/src/test/regress/expected/incremental_sort.out +++ b/src/test/regress/expected/incremental_sort.out @@ -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) diff --git a/src/test/regress/sql/incremental_sort.sql b/src/test/regress/sql/incremental_sort.sql index 2ba5d7a67d..e78a96d5bf 100644 --- a/src/test/regress/sql/incremental_sort.sql +++ b/src/test/regress/sql/incremental_sort.sql @@ -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;