diff --git a/src/sql/ob_sql_define.h b/src/sql/ob_sql_define.h index 8085bbb47a..c42faae550 100644 --- a/src/sql/ob_sql_define.h +++ b/src/sql/ob_sql_define.h @@ -499,6 +499,7 @@ enum PXParallelRule MANUAL_TABLE_HINT, // /*+ parallel(t1 3) */ SESSION_FORCE_PARALLEL, // alter session force parallel query parallel 3; MANUAL_TABLE_DOP, // create table t1 (...) parallel 3; + PL_UDF_DAS_FORCE_SERIALIZE, //stmt has_pl_udf will use das, force serialize; MAX_OPTION }; @@ -513,6 +514,7 @@ inline const char *ob_px_parallel_rule_str(PXParallelRule px_parallel_ruel) "MANUAL_TABLE_HINT", "SESSION_FORCE_PARALLEL", "MANUAL_TABLE_DOP", + "PL_UDF_DAS_FORCE_SERIALIZE", "MAX_OPTION", }; if (OB_LIKELY(px_parallel_ruel >= NOT_USE_PX) diff --git a/src/sql/optimizer/ob_explain_note.h b/src/sql/optimizer/ob_explain_note.h index 431d39f151..d9415ab46e 100644 --- a/src/sql/optimizer/ob_explain_note.h +++ b/src/sql/optimizer/ob_explain_note.h @@ -30,6 +30,7 @@ namespace sql #define PARALLEL_ENABLED_BY_TABLE_HINT "Degree of Parallelism is %ld because of hint" #define PARALLEL_ENABLED_BY_SESSION "Degree of Parallelism is %ld because of session" #define PARALLEL_ENABLED_BY_TABLE_PROPERTY "Degree of Parallelisim is %ld because of table property" +#define PARALLEL_DISABLED_BY_PL_UDF_DAS "Degree of Parallelisim is %ld because stmt contain pl_udf which force das scan" } } diff --git a/src/sql/optimizer/ob_optimizer.cpp b/src/sql/optimizer/ob_optimizer.cpp index ae32c46d01..497e31de93 100644 --- a/src/sql/optimizer/ob_optimizer.cpp +++ b/src/sql/optimizer/ob_optimizer.cpp @@ -667,6 +667,12 @@ int ObOptimizer::init_env_info(ObDMLStmt &stmt) ctx_.set_parallel_rule(PXParallelRule::USE_PX_DEFAULT); ctx_.set_parallel(ObGlobalHint::DEFAULT_PARALLEL); } + //following above rule, but if stmt contain pl_udf, force das, parallel should be 1 + if (parallel > 1 && ctx_.has_pl_udf()) { + ctx_.set_parallel_rule(PXParallelRule::PL_UDF_DAS_FORCE_SERIALIZE); + ctx_.set_parallel(1); + ctx_.add_plan_note(PARALLEL_DISABLED_BY_PL_UDF_DAS, 1); + } } // init column usage info diff --git a/src/sql/optimizer/ob_optimizer_context.h b/src/sql/optimizer/ob_optimizer_context.h index 7602c13bb4..c7b0858d1d 100644 --- a/src/sql/optimizer/ob_optimizer_context.h +++ b/src/sql/optimizer/ob_optimizer_context.h @@ -225,7 +225,8 @@ ObOptimizerContext(ObSQLSessionInfo *session_info, return px_parallel_rule_ == MANUAL_HINT || px_parallel_rule_ == MANUAL_TABLE_HINT || px_parallel_rule_ == SESSION_FORCE_PARALLEL || - px_parallel_rule_ == MANUAL_TABLE_DOP; + px_parallel_rule_ == MANUAL_TABLE_DOP || + px_parallel_rule_ == PL_UDF_DAS_FORCE_SERIALIZE; } inline bool use_intra_parallel() const {