Skip to content

Commit cc9daa0

Browse files
author
Richard Guo
committed
Short-circuit sort_inner_and_outer if there are no mergejoin clauses
In sort_inner_and_outer, we create mergejoin join paths by explicitly sorting both relations on each possible ordering of the available mergejoin clauses. However, if there are no available mergejoin clauses, we can skip this process entirely. This patch introduces a check for mergeclause_list at the beginning of sort_inner_and_outer and exits the function if it is found to be empty. This might help skip all the statements that come before the call to select_outer_pathkeys_for_merge, including the build of UniquePaths in the case of JOIN_UNIQUE_OUTER or JOIN_UNIQUE_INNER. I doubt there's any measurable performance improvement, but throughout the run of the regression tests, sort_inner_and_outer is called a total of 44,424 times. Among these calls, there are 11,064 instances where mergeclause_list is found to be empty, which accounts for approximately one-fourth. I think this suggests that implementing this shortcut is worthwhile. Author: Richard Guo Reviewed-by: Ashutosh Bapat Discussion: https://postgr.es/m/CAMbWs48RKiZGFEd5A0JtztRY5ZdvVvNiHh0AKeuoz21F+0dVjQ@mail.gmail.com
1 parent ca1ba50 commit cc9daa0

File tree

1 file changed

+4
-0
lines changed

1 file changed

+4
-0
lines changed

src/backend/optimizer/path/joinpath.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1382,6 +1382,10 @@ sort_inner_and_outer(PlannerInfo *root,
13821382
List *all_pathkeys;
13831383
ListCell *l;
13841384

1385+
/* Nothing to do if there are no available mergejoin clauses */
1386+
if (extra->mergeclause_list == NIL)
1387+
return;
1388+
13851389
/*
13861390
* We only consider the cheapest-total-cost input paths, since we are
13871391
* assuming here that a sort is required. We will consider

0 commit comments

Comments
 (0)