pluggable optimizations

moonshot/custom-path
Nils Dijk 2021-11-30 19:13:53 +01:00
parent 3e88dde672
commit 88e639283c
No known key found for this signature in database
GPG Key ID: CA1177EF9434F241
3 changed files with 75 additions and 17 deletions

View File

@ -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);
}
}

View File

@ -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(

View File

@ -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,