[66/80] [abbrv] incubator-hawq git commit: HAWQ-850. Planner supports refineCachedPlan interface.
HAWQ-850. Planner supports refineCachedPlan interface. Project: http://git-wip-us.apache.org/repos/asf/incubator-hawq/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-hawq/commit/c31209db Tree: http://git-wip-us.apache.org/repos/asf/incubator-hawq/tree/c31209db Diff: http://git-wip-us.apache.org/repos/asf/incubator-hawq/diff/c31209db Branch: refs/heads/HAWQ-543 Commit: c31209db7add5fdc252ba4a205eaee6699536e24 Parents: 48a79cc Author: hzhang2 Authored: Fri Jun 24 09:21:18 2016 +0800 Committer: hzhang2 Committed: Fri Jun 24 09:21:18 2016 +0800 -- src/backend/optimizer/plan/planner.c | 133 ++ src/include/optimizer/planner.h | 5 ++ 2 files changed, 138 insertions(+) -- http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/c31209db/src/backend/optimizer/plan/planner.c -- diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c index ecc4ce6..3006d33 100644 --- a/src/backend/optimizer/plan/planner.c +++ b/src/backend/optimizer/plan/planner.c @@ -292,6 +292,139 @@ optimize_query(Query *parse, ParamListInfo boundParams) } #endif +/** + * in PBE, plan will be cached, but splitAllocResult and resource maybe dynamic + * we need to refine cached plan, with new splitAllocResult and resource + * also note that plan need to be regenerated when resource number changed. + */ +PlannedStmt *refineCachedPlan(PlannedStmt * plannedstmt, + Query *parse, + int cursorOptions, + ParamListInfo boundParams) +{ + PlannedStmt *result = plannedstmt; + ResourceNegotiatorResult *ppResult = (ResourceNegotiatorResult *) palloc(sizeof(ResourceNegotiatorResult)); + SplitAllocResult initResult = {NULL, NULL, NIL, 0, NIL, NULL}; + ppResult->saResult = initResult; + ppResult->stmt = plannedstmt; + instr_time starttime, endtime; + + SplitAllocResult *allocResult = NULL; + Query *my_parse = copyObject(parse); + + /* If this is a parallel plan. request resource and allocate split again*/ + if (plannedstmt->planTree->dispatch == DISPATCH_PARALLEL) + { +/* + * Now, we want to allocate resource. + */ +allocResult = calculate_planner_segment_num(my_parse, plannedstmt->resource->life, +plannedstmt->rtable, plannedstmt->intoPolicy, +plannedstmt->nMotionNodes + plannedstmt->nInitPlans + 1, +-1); + +Assert(allocResult); + +ppResult->saResult = *allocResult; +pfree(allocResult); + } else { +if ((ppResult != NULL)) +{ + pfree(ppResult); + ppResult = NULL; +} +return plannedstmt; + } + + /* if vseg number changed, we need to regenerate plan. */ + if(plannedstmt->planner_segments != ppResult->saResult.planner_segments) { +gp_segments_for_planner = ppResult->saResult.planner_segments; +int optimizer_segments_saved_value = optimizer_segments; + +#ifdef USE_ORCA +/** +* If the new optimizer is enabled, try that first. If it does not return a plan, +* then fall back to the planner. +* TODO: caragg 11/08/2013: Enable ORCA when running in utility mode (MPP-21841) +*/ +if (optimizer && AmIMaster() && (GP_ROLE_UTILITY != Gp_role) && plannedstmt->planTree->dispatch == DISPATCH_PARALLEL) +{ + if (gp_log_optimization_time) + { +INSTR_TIME_SET_CURRENT(starttime); + } + START_MEMORY_ACCOUNT(MemoryAccounting_CreateAccount(0, MEMORY_OWNER_TYPE_Optimizer)); + { +if (optimizer_segments == 0) // value not set by user +{ + optimizer_segments = gp_segments_for_planner; +} + +result = optimize_query(parse, boundParams); +if (ppResult->stmt && ppResult->stmt->intoPolicy +&& result && result->intoPolicy) +{ + result->intoPolicy->bucketnum = + ppResult->stmt->intoPolicy->bucketnum; +} +optimizer_segments = optimizer_segments_saved_value; + } + END_MEMORY_ACCOUNT(); + + if (gp_log_optimization_time) + { +INSTR_TIME_SET_CURRENT(endtime); +INSTR_TIME_SUBTRACT(endtime, starttime); +elog(LOG, "Optimizer Time: %.3f ms", INSTR_TIME_GET_MILLISEC(endtime)); + } +} +#endif + +if (!result) +{ + if (gp_log_optimization_time) + { +INSTR_TIME_SET_CURRENT(starttime); + } + START_MEMORY_ACCOUNT(MemoryAccounting_CreateAccount(0, MEMORY_OWNER_TYPE_Planner)); + { +if (NULL != planner_hook) +{ + result = (*planner_hook) (parse, cursorOptions, boundParams, plannedstmt->resource->life); +} +else +{ + result = standard_planner(parse, cursorOptions, bo
[66/80] [abbrv] incubator-hawq git commit: HAWQ-850. Planner supports refineCachedPlan interface.
HAWQ-850. Planner supports refineCachedPlan interface. Project: http://git-wip-us.apache.org/repos/asf/incubator-hawq/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-hawq/commit/c31209db Tree: http://git-wip-us.apache.org/repos/asf/incubator-hawq/tree/c31209db Diff: http://git-wip-us.apache.org/repos/asf/incubator-hawq/diff/c31209db Branch: refs/heads/HAWQ-537 Commit: c31209db7add5fdc252ba4a205eaee6699536e24 Parents: 48a79cc Author: hzhang2 Authored: Fri Jun 24 09:21:18 2016 +0800 Committer: hzhang2 Committed: Fri Jun 24 09:21:18 2016 +0800 -- src/backend/optimizer/plan/planner.c | 133 ++ src/include/optimizer/planner.h | 5 ++ 2 files changed, 138 insertions(+) -- http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/c31209db/src/backend/optimizer/plan/planner.c -- diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c index ecc4ce6..3006d33 100644 --- a/src/backend/optimizer/plan/planner.c +++ b/src/backend/optimizer/plan/planner.c @@ -292,6 +292,139 @@ optimize_query(Query *parse, ParamListInfo boundParams) } #endif +/** + * in PBE, plan will be cached, but splitAllocResult and resource maybe dynamic + * we need to refine cached plan, with new splitAllocResult and resource + * also note that plan need to be regenerated when resource number changed. + */ +PlannedStmt *refineCachedPlan(PlannedStmt * plannedstmt, + Query *parse, + int cursorOptions, + ParamListInfo boundParams) +{ + PlannedStmt *result = plannedstmt; + ResourceNegotiatorResult *ppResult = (ResourceNegotiatorResult *) palloc(sizeof(ResourceNegotiatorResult)); + SplitAllocResult initResult = {NULL, NULL, NIL, 0, NIL, NULL}; + ppResult->saResult = initResult; + ppResult->stmt = plannedstmt; + instr_time starttime, endtime; + + SplitAllocResult *allocResult = NULL; + Query *my_parse = copyObject(parse); + + /* If this is a parallel plan. request resource and allocate split again*/ + if (plannedstmt->planTree->dispatch == DISPATCH_PARALLEL) + { +/* + * Now, we want to allocate resource. + */ +allocResult = calculate_planner_segment_num(my_parse, plannedstmt->resource->life, +plannedstmt->rtable, plannedstmt->intoPolicy, +plannedstmt->nMotionNodes + plannedstmt->nInitPlans + 1, +-1); + +Assert(allocResult); + +ppResult->saResult = *allocResult; +pfree(allocResult); + } else { +if ((ppResult != NULL)) +{ + pfree(ppResult); + ppResult = NULL; +} +return plannedstmt; + } + + /* if vseg number changed, we need to regenerate plan. */ + if(plannedstmt->planner_segments != ppResult->saResult.planner_segments) { +gp_segments_for_planner = ppResult->saResult.planner_segments; +int optimizer_segments_saved_value = optimizer_segments; + +#ifdef USE_ORCA +/** +* If the new optimizer is enabled, try that first. If it does not return a plan, +* then fall back to the planner. +* TODO: caragg 11/08/2013: Enable ORCA when running in utility mode (MPP-21841) +*/ +if (optimizer && AmIMaster() && (GP_ROLE_UTILITY != Gp_role) && plannedstmt->planTree->dispatch == DISPATCH_PARALLEL) +{ + if (gp_log_optimization_time) + { +INSTR_TIME_SET_CURRENT(starttime); + } + START_MEMORY_ACCOUNT(MemoryAccounting_CreateAccount(0, MEMORY_OWNER_TYPE_Optimizer)); + { +if (optimizer_segments == 0) // value not set by user +{ + optimizer_segments = gp_segments_for_planner; +} + +result = optimize_query(parse, boundParams); +if (ppResult->stmt && ppResult->stmt->intoPolicy +&& result && result->intoPolicy) +{ + result->intoPolicy->bucketnum = + ppResult->stmt->intoPolicy->bucketnum; +} +optimizer_segments = optimizer_segments_saved_value; + } + END_MEMORY_ACCOUNT(); + + if (gp_log_optimization_time) + { +INSTR_TIME_SET_CURRENT(endtime); +INSTR_TIME_SUBTRACT(endtime, starttime); +elog(LOG, "Optimizer Time: %.3f ms", INSTR_TIME_GET_MILLISEC(endtime)); + } +} +#endif + +if (!result) +{ + if (gp_log_optimization_time) + { +INSTR_TIME_SET_CURRENT(starttime); + } + START_MEMORY_ACCOUNT(MemoryAccounting_CreateAccount(0, MEMORY_OWNER_TYPE_Planner)); + { +if (NULL != planner_hook) +{ + result = (*planner_hook) (parse, cursorOptions, boundParams, plannedstmt->resource->life); +} +else +{ + result = standard_planner(parse, cursorOptions, bo