diff --git a/src/backend/distributed/planner/path_based_planner.c b/src/backend/distributed/planner/path_based_planner.c index f30a31139..59fb183d8 100644 --- a/src/backend/distributed/planner/path_based_planner.c +++ b/src/backend/distributed/planner/path_based_planner.c @@ -31,8 +31,6 @@ #include "utils/builtins.h" #include "utils/syscache.h" -typedef List *(*optimizeFn)(PlannerInfo *root, Path *originalPath); - typedef struct DistributedUnionPath { CustomPath custom_path; @@ -136,20 +134,22 @@ Cost RepartitionStartupCost = 1000; Cost RepartitionPerRowCost = .000; Cost RepartitionPerMBCost = .01; -/* list of functions that will be called to optimized in the joinhook*/ -static optimizeFn joinOptimizations[] = { - OptimizeJoinPath, - OptimizeRepartitionInnerJoinPath, +/* list of functions that will be called to optimized in the join hook */ +OptimizationEntry joinOptimizations[] = { + {.name = "pushdown", .fn = OptimizeJoinPath, .enabled = true}, + {.name = "repartition", .fn = OptimizeRepartitionInnerJoinPath, .enabled = true}, -/* BroadcastOuterJoinPath, */ -/* BroadcastInnerJoinPath, */ -/* GeoOverlapJoin, */ + {.name = "broadcast_outer", .fn = BroadcastOuterJoinPath, .enabled = false}, + {.name = "broadcast_inner", .fn = BroadcastInnerJoinPath, .enabled = false}, + {.name = "geooverlap", .fn = GeoOverlapJoin, .enabled = false}, + {}, }; -static optimizeFn groupOptimizations[] = { - PushDownAggPath, - PartialPushDownAggPath, - RepartitionAggPath, +OptimizationEntry groupOptimizations[] = { + {.name = "pushdown", .fn = PushDownAggPath, .enabled = true}, + {.name = "partial_pushdown", .fn = PartialPushDownAggPath, .enabled = true}, + {.name = "repartition", .fn = RepartitionAggPath, .enabled = true}, + {}, }; const CustomPathMethods geoScanMethods = { @@ -1600,9 +1600,15 @@ PathBasedPlannerJoinHook(PlannerInfo *root, Path *originalPath = NULL; foreach_ptr(originalPath, joinrel->pathlist) { - for (int i = 0; i < sizeof(joinOptimizations) / sizeof(joinOptimizations[1]); i++) + for (int i = 0; joinOptimizations[i].fn != NULL; i++) { - List *alternativePaths = joinOptimizations[i](root, originalPath); + if (!joinOptimizations[i].enabled) + { + /* skip disabled optimizations */ + continue; + } + + List *alternativePaths = joinOptimizations[i].fn(root, originalPath); newPaths = list_concat(newPaths, alternativePaths); } } @@ -1998,9 +2004,15 @@ PathBasedPlannerGroupAgg(PlannerInfo *root, foreach_ptr(originalPath, output_rel->pathlist) { /* apply all optimizations on every available path */ - for (int i = 0; i < sizeof(groupOptimizations) / sizeof(groupOptimizations[1]); i++) + for (int i = 0; groupOptimizations[i].fn != NULL; i++) { - List *alternativePaths = groupOptimizations[i](root, originalPath); + if (!groupOptimizations[i].enabled) + { + /* skip optimizations when they are disabled */ + continue; + } + + List *alternativePaths = groupOptimizations[i].fn(root, originalPath); newPaths = list_concat(newPaths, alternativePaths); } } diff --git a/src/backend/distributed/shared_library_init.c b/src/backend/distributed/shared_library_init.c index ad50f72e0..539b26f7d 100644 --- a/src/backend/distributed/shared_library_init.c +++ b/src/backend/distributed/shared_library_init.c @@ -1260,6 +1260,40 @@ RegisterCitusConfigVariables(void) GUC_STANDARD, NULL,NULL,NULL); + /* pathbased planner optimization rules */ + StringInfoData buf = { 0 }; + initStringInfo(&buf); + + for (int i = 0; joinOptimizations[i].fn != NULL; i++) + { + resetStringInfo(&buf); + appendStringInfo(&buf, "citus.path_based_planner_join_%s", joinOptimizations[i].name); + DefineCustomBoolVariable( + pstrdup(buf.data), + gettext_noop("Path based planner join optimization"), + NULL, + &joinOptimizations[i].enabled, + joinOptimizations[i].enabled, + PGC_USERSET, + GUC_STANDARD, + NULL, NULL, NULL); + } + + for (int i = 0; groupOptimizations[i].fn != NULL; i++) + { + resetStringInfo(&buf); + appendStringInfo(&buf, "citus.path_based_planner_group_%s", groupOptimizations[i].name); + DefineCustomBoolVariable( + pstrdup(buf.data), + gettext_noop("Path based planner join optimization"), + NULL, + &groupOptimizations[i].enabled, + groupOptimizations[i].enabled, + PGC_USERSET, + GUC_STANDARD, + NULL, NULL, NULL); + } + DefineCustomIntVariable( "citus.local_shared_pool_size", gettext_noop( diff --git a/src/include/distributed/path_based_planner.h b/src/include/distributed/path_based_planner.h index 43c48cb31..34f6db686 100644 --- a/src/include/distributed/path_based_planner.h +++ b/src/include/distributed/path_based_planner.h @@ -8,6 +8,15 @@ #include "nodes/parsenodes.h" #include "nodes/pathnodes.h" +typedef List *(*optimizeFn)(PlannerInfo *root, Path *originalPath); + +typedef struct OptimizationEntry +{ + const char *name; + bool enabled; + optimizeFn fn; +} OptimizationEntry; + extern bool EnableBroadcastJoin; extern Cost CollectStartupCost; @@ -18,6 +27,9 @@ extern Cost RepartitionStartupCost; extern Cost RepartitionPerRowCost; extern Cost RepartitionPerMBCost; +extern OptimizationEntry joinOptimizations[]; +extern OptimizationEntry groupOptimizations[]; + extern void PathBasedPlannerRelationHook(PlannerInfo *root, RelOptInfo *relOptInfo, Index restrictionIndex,