From 746a10cf030ba642a53804646311a6612d53f5a4 Mon Sep 17 00:00:00 2001 From: laishenghao Date: Sat, 26 Nov 2022 17:36:16 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90bugfixed=E3=80=91=E8=A7=A3=E5=86=B3?= =?UTF-8?q?=E6=89=93=E5=BC=80enable=5Fcachedplan=5Fmgr=E5=90=8E=EF=BC=8C?= =?UTF-8?q?=E6=89=A7=E8=A1=8C=E5=90=AB/*+=20choose=5Fadaptive=5Fgplan=20*/?= =?UTF-8?q?=E7=9A=84PBE=E6=9F=A5=E8=AF=A2=E6=8A=A5=E9=94=99=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/backend/utils/cache/plancache.cpp | 1 + .../optimizer/gplanmgr/gplanmgr.cpp | 27 +++++++++- src/include/utils/plancache.h | 1 + src/test/regress/expected/hw_pbe.out | 53 +++++++++++++++++++ src/test/regress/sql/hw_pbe.sql | 30 +++++++++++ 5 files changed, 111 insertions(+), 1 deletion(-) diff --git a/src/common/backend/utils/cache/plancache.cpp b/src/common/backend/utils/cache/plancache.cpp index a85ffa9f5..881fa4c64 100644 --- a/src/common/backend/utils/cache/plancache.cpp +++ b/src/common/backend/utils/cache/plancache.cpp @@ -288,6 +288,7 @@ CachedPlanSource* CreateCachedPlan(Node* raw_parse_tree, const char* query_strin plansource->sql_patch_sequence = pg_atomic_read_u64(&g_instance.cost_cxt.sql_patch_sequence_id); plansource->planManager = NULL; plansource->gpc_lockid = -1; + plansource->hasSubQuery = false; #ifdef ENABLE_MOT diff --git a/src/gausskernel/optimizer/gplanmgr/gplanmgr.cpp b/src/gausskernel/optimizer/gplanmgr/gplanmgr.cpp index a74778f5f..46e23a16a 100644 --- a/src/gausskernel/optimizer/gplanmgr/gplanmgr.cpp +++ b/src/gausskernel/optimizer/gplanmgr/gplanmgr.cpp @@ -143,7 +143,7 @@ ChooseAdaptivePlan(CachedPlanSource *plansource, ParamListInfo boundParams) return false; } - if(!selec_gplan_by_hint(plansource)){ + if(plansource->hasSubQuery || !selec_gplan_by_hint(plansource)){ PMGR_ReleasePlanManager(plansource); return false; } @@ -474,6 +474,7 @@ InsertPlan(CachedPlanSource *plansource, } else { plan->refcount++; } + plan->is_saved = true; plan->cpi = cpinfo; (void)MemoryContextSwitchTo(planMgr->context); @@ -658,6 +659,25 @@ FindMatchedPlan(PlanManager *manager, PlannerInfo *queryRoot) return NULL; } +bool ContainSubQuery(PlannerInfo* root) +{ + if (root->glob->subroots != NIL) { + return true; + } + + /* 0 for other purpose, so start from 1 */ + for (int i = 1; i < root->simple_rel_array_size; ++i) { + RelOptInfo* rel = root->simple_rel_array[i]; + if (!rel) { + continue; + } + if (rel->rtekind == RTE_SUBQUERY) { + return true; + } + } + return false; +} + void CacheGenericRoot(CachedPlanSource *plansource, char *psrc_key) { @@ -868,6 +888,11 @@ ActionHandle(CachedPlanSource *plansource, /* acquire an exclusive lock to update plan manager. */ ManagerLockSwitchTo(action, LW_EXCLUSIVE); + if (ContainSubQuery((PlannerInfo*)u_sess->pcache_cxt.explored_plan_info)) { + manager->is_valid = false; + plansource->hasSubQuery = true; + } + /* * A valid save_xmin (!= 0) imples that the plan is temporary. To prevent * the high cost of plan revaildation, we do not cache such plan to avoid diff --git a/src/include/utils/plancache.h b/src/include/utils/plancache.h index 645a3429e..70b9d394b 100644 --- a/src/include/utils/plancache.h +++ b/src/include/utils/plancache.h @@ -409,6 +409,7 @@ typedef struct CachedPlanSource { PlanManager *planManager; int gpc_lockid; int nextval_default_expr_type; + bool hasSubQuery; } CachedPlanSource; /* diff --git a/src/test/regress/expected/hw_pbe.out b/src/test/regress/expected/hw_pbe.out index 678d2c112..dd81e4e27 100644 --- a/src/test/regress/expected/hw_pbe.out +++ b/src/test/regress/expected/hw_pbe.out @@ -4196,3 +4196,56 @@ select * from bs_his order by period_name; drop FUNCTION test_func; drop table bs_his; drop table cs_his; +-- pbe choose_adaptive_gplan +create table tab_1103983(c1 int,c2 varchar,c3 text) ; +insert into tab_1103983 values(generate_series(1, 500),generate_series(1, 500),generate_series(1, 100)); +insert into tab_1103983 values(generate_series(1, 50),generate_series(2, 30),generate_series(2, 30)); +insert into tab_1103983 values(generate_series(2, 30),generate_series(2, 50),generate_series(2, 30)); +insert into tab_1103983 values(generate_series(2, 30),generate_series(2, 30),generate_series(1, 50)); +insert into tab_1103983 values(generate_series(1, 100),null,null); +insert into tab_1103983 values(generate_series(1, 500),generate_series(1, 500),generate_series(2, 100)); +create index on tab_1103983(c2,c3); +analyze tab_1103983; +prepare pbe_cagp as select /*+ choose_adaptive_gplan */ t1.c1,max(t2.c3) from tab_1103983 t1 + join (select /*+ choose_adaptive_gplan */ * from tab_1103983 where c1=$1 and c2 = $2) t2 + on t1.c1 = t2.c1 + where t2.c2 = (select max(c2) from tab_1103983 where c2 = $1 ) + and t1.c3 = $2 + group by 1 + order by 1,2; +execute pbe_cagp(1,1); + c1 | max +----+----- + 1 | 99 +(1 row) + +execute pbe_cagp(3,3); + c1 | max +----+----- + 3 | 99 +(1 row) + +execute pbe_cagp(4,4); + c1 | max +----+----- + 4 | 99 +(1 row) + +execute pbe_cagp(5,1); + c1 | max +----+----- +(0 rows) + +execute pbe_cagp(7,8); + c1 | max +----+----- +(0 rows) + +execute pbe_cagp(10,10); + c1 | max +----+----- + 10 | 99 +(1 row) + +deallocate pbe_cagp; +drop table tab_1103983; diff --git a/src/test/regress/sql/hw_pbe.sql b/src/test/regress/sql/hw_pbe.sql index 1ebd62f5f..f75198212 100644 --- a/src/test/regress/sql/hw_pbe.sql +++ b/src/test/regress/sql/hw_pbe.sql @@ -820,3 +820,33 @@ select * from bs_his order by period_name; drop FUNCTION test_func; drop table bs_his; drop table cs_his; + +-- pbe choose_adaptive_gplan +create table tab_1103983(c1 int,c2 varchar,c3 text) ; +insert into tab_1103983 values(generate_series(1, 500),generate_series(1, 500),generate_series(1, 100)); +insert into tab_1103983 values(generate_series(1, 50),generate_series(2, 30),generate_series(2, 30)); +insert into tab_1103983 values(generate_series(2, 30),generate_series(2, 50),generate_series(2, 30)); +insert into tab_1103983 values(generate_series(2, 30),generate_series(2, 30),generate_series(1, 50)); +insert into tab_1103983 values(generate_series(1, 100),null,null); +insert into tab_1103983 values(generate_series(1, 500),generate_series(1, 500),generate_series(2, 100)); +create index on tab_1103983(c2,c3); + +analyze tab_1103983; + +prepare pbe_cagp as select /*+ choose_adaptive_gplan */ t1.c1,max(t2.c3) from tab_1103983 t1 + join (select /*+ choose_adaptive_gplan */ * from tab_1103983 where c1=$1 and c2 = $2) t2 + on t1.c1 = t2.c1 + where t2.c2 = (select max(c2) from tab_1103983 where c2 = $1 ) + and t1.c3 = $2 + group by 1 + order by 1,2; + +execute pbe_cagp(1,1); +execute pbe_cagp(3,3); +execute pbe_cagp(4,4); +execute pbe_cagp(5,1); +execute pbe_cagp(7,8); +execute pbe_cagp(10,10); + +deallocate pbe_cagp; +drop table tab_1103983;