暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

AntDB 数据库分布式功能-FQS增强15

tocata 2024-09-02
36

FQS 不支持的场景

不支持 FQS 的条件

下述表格展示了一些典型不支持 FQS 的条件:

序号约束条件具体条件具体条件是否支持
1当use_aux_type != USE_AUX_OFF循环表判断是否是RTE_RELATION且调用HasAuxRelation为true不支持
2当是insert命令:1)判断表只有1张(插入记录只有1条)且insert目标里面包含了可变函数(contain_volatile_functions),不支持FQS 2)插入多条记录(RTE)时,判断每条记录里面value里面有可变函数的(contain_volatile_functions),不支持FQS不支持
2)插入多条记录(RTE)时,判断每条记录里面value里面有可变函数的(contain_volatile_functions),不支持FQS不支持
3insert 的SQL语句,分布表的带nextval序列等动态函数的,WHERE条件里面带= 分布键insert 的SQL语句,分布表的带nextval序列等动态函数的,WHERE条件里面带= 分布键不支持
4update 的SQL语句,分布表的带nextval序列等动态函数的,WHERE条件里面带= 分布键update 的SQL语句,分布表的带nextval序列等动态函数的,WHERE条件里面带= 分布键不支持
5右连接 不支持 FQS右连接 不支持 FQS不支持
6表有多个分片键的不支持FQS不支持
7ora连接的(query->connect_by),不支持FQS不支持
8触发器、规则,不支持FQS基本不支持,rule会在rewrite的时候会导致语句添加某些不满足ship的条件
9with子句的,不支持FQS不支持
10有子链接的(query->hasSubLinks),且执行节点不是复制表且其子查询也不是复制表的,不支持FQS不支持
11单节点表达式:执行节点数量不等于1,且非单点表达式的且不是复制表不支持ok
12insert 且表达式是返回set的(expression_returns_set) 或表达式有序列不支持FQS不支持
13是插入或更新的语句,且是复制表的,且目标列有序列表达式的,不支持FQS不支持
14insert且是分布表的:1)分布键不是1个的,返回NULL ,不支持FQS不支持
2)分布键是1个的,且target里面不包含分布列的,返回NULL ,不支持FQS不支持
15RTE不支持FQS1)RTE_JOIN 不支持FQS不支持
2)RTE_CTE 不支持FQS不支持
3)RTE_FUNCTION 不支持FQS不支持
4)RTE_VALUES 不支持FQS不支持
16有不支持的表达式的,只能在cn节点上执行的表达式等,具体的表达式见下面:不支持FQS1) 有不支持的表达式的 SS_UNSUPPORTED_EXPR:a.包含query->returningList的(包含查询的独立表达式不可发送)不支持
b.CMD_UTILITY且是建表语句不支持
c.有hasRecursive with(query->hasRecursive)语句的不支持
d.不是查询并且表数量大于1(list_length(query->rtable) > 1)的不支持
e.有转换类型不对的表达式(比如表字段是char,但是你prepare 定义了int,输入了int的)不支持
f.节点里面有T_SetToDefault 不可透传不支持
g.节点类型是参数(T_Param)且param->paramkind != PARAM_EXTERN不支持
h.节点是T_SortGroupClause 且是sc_context->sc_for_expr = true不支持
i.节点是T_FROMExpr,且是孤独立表达式(c_context->sc_for_expr)不支持
j.节点是T_FROMExpr,且有条件的insert 语句: sc_context->sc_query->commandType == CMD_INSERT && ((FROMExpr *)node)->quals不支持,无法直接构造例子,但是通过在表上创建rule,可以达成类似的效果
k.节点是T_JoinExpr:且是独立表达式(sc_context->sc_for_expr)不支持
l.占位符等等表达式(T_SubPlan、T_AlternativeSubPlan、T_CommonTableExpr、T_SetOperationStmt、T_PlaceHolderVar、T_AppendRelInfo、T_PlaceHolderInfo)不支持
2) 有不能透传的表达式(SS_UNSHIPPABLE_EXPR):a.节点是T_Query 且是独立表达式的(sc_context->sc_for_expr)不支持
b.节点是T_TargetEntry且表达式是空或者是伪类型 (typtype == TYPTYPE_PSEUDO)不支持
c. 节点类型是T_CoerceViaIO且不能强制转换的(!can_coerce_type(1, &input_type, &output_type, cc))(有转换类型不对的表达式)不支持
d.节点是T_FuncExpr且有非安全的函数的。(s,有nextsql等这些函数的)。不支持
e.节点是T_FuncExpr 且funcexpr->funcretset && sc_context->sc_for_expr不支持
f.节点是T_NullIfExpr、T_OpExpr、T_OpExpr且是无效的函数或者是不安全的。不支持
g.T_ScalarArrayOpExpr且是无效的函数或者是不安全的。不支持
h.节点是T_WindowFunc:有独立表达式或不安全函数的sc_context->sc_for_expr || !pgxc_is_func_shippable(winf->winfnoid)不支持
i.节点是T_WindowClause且有独立表达式的:sc_context->sc_for_expr不支持
3) 有只能cn节点执行的表达式(SS_NEEDS_COORD):a.query->is_local an EXEC DIRECT o不支持
b.pgxc_query_contains_only_pg_catalog:如果查询只涉及目录表,而不是EXEC直接语句,则可 以完全在协调器上进行计算。不需要涉及数据节点。不支持
c.ora且T_RownumExpr的不支持
d.节点是T_NextValueExpr 且是临时表的 临时序列 (get_rel_persistence(((NextValueExpr*)node)->seqid) == RELPERSISTENCE_TEMP)不支持
e.节点是函数(T_FuncExpr)且是序列的,且是临时表,临时序列的,非const的(!IsA(c, Const) ||不支持
get_rel_persistence(DatumGetObjectId(c->constvalue)) == RELPERSISTENCE_TEMP)
f.节点是T_WithCheckOption && wco->kind == WCO_VIEW_CHECK不支持
4)SS_NEED_SINGLENODE:a.节点是T_Query且是窗口函数、排序、limitoffsert、limitcount,执行节点数量不等于1,且非单点表达式的且不是复制表。不支持
b. 节点是T_Query且是aggs或having且执行节点group里面没分布列的,执行节点数量不等于1,且非单点表达式的且不是复制表。不支持
c. 节点是T_Query且是groupClause 非空且执行节点group里面没分布列的,执行节点数量不等于1,且非单点表达式的且不是复制表。不支持
d. 节点是T_Query且是distinctClause且distinctClause里面没有分布列的,执行节点数量不等于1,且非单点表达式的且不是复制表。不支持
e. 节点是T_Aggref,且有排序或DISTINCT或具有多态转换类型的聚合等的(aggref->aggorder || aggref->aggdistinct ||aggref->agglevelsup ||!aggref->agghas_collectfn ||IsPolymorphicType(aggref->aggtrantype)),执行节点数量不等于1,且非单点表达式的且不是复制表。不支持
f.节点是T_GroupingFunc的,执行节点数量不等于1,且非单点表达式的且不是复制表。不支持
g.节点是T_WindowFunc的,执行节点数量不等于1,且非单点表达式的且不是复制表。不支持
h.节点是T_WindowClause,执行节点数量不等于1,且非单点表达式的且不是复制表。不支持
5)SS_VARLEVELa.是子查询引用外层语句的列(sc_context->sc_max_varlevelsup != 0)不支持
6)SS_UNSHIPPABLE_TRIGGERa.节点是T_Query且sql命令是insert、update、delete 且是不可透传的触发器(!pgxc_check_triggers_shippability(rte->relid,query->commandType))不支持
7)SS_UNSHIPPABLE_RELATIONa. 节点是T_Query且是update、insert、delete命令,且HasAuxRelation(辅助关系)不支持
b. 节点是T_Query且是update 且没有target目标列的不支持。
c. 节点是T_Query且是SELECT的,并且是继承表且能找到继承的子表的 (find_inheritance_children)不支持
8)SS_NO_NODES:a.节点是T_SubLink,没有找到累积的可透传节点的或可合并的节点(!sc_context->sc_subquery_en)不支持
9)SS_UNSHIPPABLE_TYPE节点表达式里面含有序列、视图、外表(RELKIND_SEQUENCE、RELKIND_VIEW、RELKIND_FOREIGN_TABLE)的不支持

不支持 FQS 的部分具体 SQL 的 示例

序号具体功能点具体 SQL
1右连接 不支持 FQSEXPLAIN (verbose) SELECT EMP_ID, NAME, DEPT FROM FQS_COMPANY RIGHT OUTER JOIN FQS_DEPARTMENT ON FQS_COMPANY.ID = FQS_DEPARTMENT.ID;
2左连接2表on的条件都包含分片键的且有排序的(按分片键排序或其他键排序),不支持 FQSEXPLAIN (verbose) SELECT EMP_ID, NAME, DEPT FROM FQS_COMPANY LEFT OUTER JOIN FQS_DEPARTMENT ON FQS_COMPANY.ID = FQS_DEPARTMENT.ID ORDER BY FQS_COMPANY.ID;
3全连接2表on的条件都包含分片键的且有排序的(按分片键排序或其他键排序),不支持 FQSEXPLAIN (verbose) SELECT EMP_ID, NAME, DEPT FROM FQS_COMPANY FULL OUTER JOIN FQS_DEPARTMENT ON FQS_COMPANY.ID = FQS_DEPARTMENT.ID ORDER BY FQS_COMPANY.ID;
4insert 的SQL语句,分布表的带nextval序列等动态函数的,insert条件里面带分布键,分布键是静态参数或动态绑定变量参数的,不支持 FQSPREPARE s_insert_seqval(int) AS INSERT INTO fqs_test_insert_dist (no_w_id, no_d_id) VALUES ($1, nextval('fqs_test_id_seq'));EXPLAIN (verbose) EXECUTE s_insert_seqval(1); EXPLAIN (verbose) INSERT INTO fqs_test_insert_dist (no_w_id, no_d_id) VALUES (3, nextval('fqs_test_id_seq'));
5update 的SQL语句,分布表的带nextval序列等动态函数的,insert条件里面带分布键,分布键是静态参数或动态绑定变量参数的,不支持 FQSPREPARE s_update_seqval(int) AS UPDATE fqs_test_insert_dist set no_d_id = nextval('fqs_test_id_seq') WHERE no_w_id = $1;EXPLAIN (verbose) execute s_update_seqval(1); EXPLAIN (verbose) UPDATE fqs_test_insert_dist set no_d_id = nextval('fqs_test_id_seq') WHERE no_w_id = 5;
6Insert to one DN node,RTE不支持(批量插入)FQSEXPLAIN verbose INSERT INTO fqs_t_DN1 VALUES(5,1,'111'),(6,2,'22'),(7,3,'33'),(8,4,'444');
7关联子查询不支持FQSCREATE TABLE fqs_employee (id int,name varchar(10),age int,role varchar(10)) distribute by hash(id);EXPLAIN VERBOSE SELECT id,name,age FROM fqs_employee as t1 WHERE age > (SELECT avg(age) FROM fqs_employee as t2 WHERE t1.role=t2.role group by role);
8随机分布的表支持单表查询,条件中包含分片键且是静态常量的,有排序的,排序键是分片键或非分片键的,不支持FQSEXPLAIN (verbose) SELECT * FROM fqs_test_random WHERE id=1 order by id; EXPLAIN (verbose) SELECT * FROM fqs_test_random PREPARE id=1 order by name;
9子链接不支持EXPLAIN VERBOSE SELECT * FROM fqs_COMPANY c WHERE c.ID IN(SELECT D.EMP_ID FROM fqs_DEPARTMENT D WHERE D.DEPT = 'IT Billing');
10分布键是int/char,且是hash分布的,条件中包含分布键且含有or/in多个条件的,且是动态绑定变量的,查询的数据都在同一个DN节点的,不支持FQSPREPARE fqs_t_char_bind(varchar,varchar) as SELECT sum(id) FROM fqs_t_char WHERE name=$1 or name=$2;EXPLAIN (verbose) execute fqs_t_char_bind('name101','name102');PREPARE fqs_t_int_bind(int,int) as SELECT count(iid) FROM fqs_t_int WHERE id=$1 or id=$2;EXPLAIN (verbose) execute fqs_t_int_bind(808,809);
111张按hash分布的表,1张取mod分布的表,join的条件是分布键,有或者没有排序,join的类型是内连接、左连接、全连接,不支持FQSEXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_hash1 t1 inner join fqs_test_mod1 t2 on (t1.id = t2.id);EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_hash1 t1 left outer join fqs_test_mod1 t2 on (t1.id = t2.id);EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_hash1 t1 FULL OUTER JOIN fqs_test_mod1 t2 on (t1.id = t2.id);
121张按hash分布的表,1张复制表,join的条件是分布键,有或者没有排序,join的类型是全连接,不带WHERE条件,不支持FQSEXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_hash1 t1 FULL OUTER JOIN fqs_test_repl1 t2 on (t1.id = t2.id);
131张按hash分布的表,1张按random分布的表,join的条件是分布键,有或者没有排序,join的类型是内连接、左连接、全连接,不带WHERE条件,不支持FQSEXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_hash1 t1 inner join fqs_test_random1 t2 on (t1.id = t2.id);EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_hash1 t1 left outer join fqs_test_random1 t2 on (t1.id = t2.id);EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_hash1 t1 FULL OUTER JOIN fqs_test_random1 t2 on (t1.id = t2.id);
141张取mod分布的表,1张按hash分布的表,join的条件是分布键,有或者没有排序,join的类型是内连接、左连接、全连接,不带WHERE条件,不支持FQSEXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_mod1 t1 inner join fqs_test_hash1 t2 on (t1.id = t2.id);EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_mod1 t1 left outer join fqs_test_hash1 t2 on (t1.id = t2.id);EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_mod1 t1 FULL OUTER JOIN fqs_test_hash1 t2 on (t1.id = t2.id);
151张取mod分布的表,1张复制表,join的条件是分片键,有或没有排序,join的类型是全连接,不带WHERE条件,不支持FQSEXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_mod1 t1 FULL OUTER JOIN fqs_test_repl1 t2 on (t1.id = t2.id);
161张取mod分布的表,1张按random分布的表,join的条件是分片键,有或没有排序,join的类型是内连接、左连接、全连接,不带WHERE条件,不支持FQSEXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_mod1 t1 inner join fqs_test_random1 t2 on (t1.id = t2.id);EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_mod1 t1 left outer join fqs_test_random1 t2 on (t1.id = t2.id);EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_mod1 t1 FULL OUTER JOIN fqs_test_random1 t2 on (t1.id = t2.id);
171张复制表,一张按hash分布的表,join的条件是分片键,有或没有排序,join的类型是左连接、全连接,不带WHERE条件,不支持FQSEXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_repl1 t1 left outer join fqs_test_hash1 t2 on (t1.id = t2.id);EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_repl1 t1 FULL OUTER JOIN fqs_test_hash1 t2 on (t1.id = t2.id);
181张复制表,一张取mod分布的表,join的条件是分片键,有或没有排序,join的类型是左连接、全连接,不带WHERE条件,不支持FQSEXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_repl1 t1 left outer join fqs_test_mod1 t2 on (t1.id = t2.id);EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_repl1 t1 FULL OUTER JOIN fqs_test_mod1 t2 on (t1.id = t2.id);
191张复制表,1张按random分布的表,join的条件是分片键,join的类型是内连接,带排序,不支持FQSEXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_repl1 t1 inner join fqs_test_random1 t2 on (t1.id = t2.id) order by t1.id;
201张复制表,1张按random分布的表,join的条件是分片键,join的类型是左连接、全连接,带或不带排序,不支持FQSEXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_repl1 t1 left outer join fqs_test_random1 t2 on (t1.id = t2.id);EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_repl1 t1 FULL OUTER JOIN fqs_test_random1 t2 on (t1.id = t2.id);
211张按random分布的表,1张按hash分布的表,join的条件是分片键,join的类型是内连接、左连接、全连接,不带排序/带排序,不带WHERE条件,不支持FQSEXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_random1 t1 inner join fqs_test_hash1 t2 on (t1.id = t2.id);EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_random1 t1 left outer join fqs_test_hash1 t2 on (t1.id = t2.id);EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_random1 t1 FULL OUTER JOIN fqs_test_hash1 t2 on (t1.id = t2.id);
221张按random分布的表,1张取mod分布的表, join的条件是分片键,有或没有排序,join的类型是内连接、左连接、全连接,不带WHERE条件,不支持FQSEXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_random1 t1 inner join fqs_test_mod1 t2 on (t1.id = t2.id);EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_random1 t1 left outer join fqs_test_mod1 t2 on (t1.id = t2.id);EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_random1 t1 FULL OUTER JOIN fqs_test_mod1 t2 on (t1.id = t2.id);
231张按random分布的表,1张复制表,join的条件是分片键,join的类型是全连接,不带排序/带排序,不带WHERE条件,不支持FQSEXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_random1 t1 FULL OUTER JOIN fqs_test_repl1 t2 on (t1.id = t2.id);
241张按random分布的表,1张按random分布的表,join的条件是随意,join的类型是内连接、左连接、全连接,不带排序/带排序,不带WHERE条件,不支持FQSEXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_random1 t1 inner join fqs_test_random2 t2 on (t1.id = t2.id);EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_random1 t1 left outer join fqs_test_random2 t2 on (t1.id = t2.id);EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_random1 t1 FULL OUTER JOIN fqs_test_random2 t2 on (t1.id = t2.id);
251张hash表,1张取mod分布的表,join条件是分片键,join的类型是内连接、左连接、全连接,WHERE的条件是分片键或非分片键“=”条件且参数是静态或动态绑定变量的,不带排序的/带排序的,都不支持FQSEXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_hash1 t1 inner join fqs_test_mod1 t2 on (t1.id = t2.id) WHERE t1.id =3;EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_hash1 t1 left outer join fqs_test_mod1 t2 on (t1.id = t2.id) WHERE t1.id =3;EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_hash1 t1 FULL OUTER JOIN fqs_test_mod1 t2 on (t1.id = t2.id) WHERE t1.id =3;prepare s_table_join4(int) as SELECT t1.id, t1.name FROM fqs_test_hash1 t1 inner join fqs_test_mod1 t2 on (t1.id = t2.id) WHERE t1.id = $1;EXPLAIN verbose execute s_table_join4(3);prepare s_table_join5(int) as SELECT t1.id, t1.name FROM fqs_test_hash1 t1 left outer join fqs_test_mod1 t2 on (t1.id = t2.id) WHERE t1.id = $1;EXPLAIN verbose execute s_table_join5(3);prepare s_table_join6(int) as SELECT t1.id, t1.name FROM fqs_test_hash1 t1 FULL OUTER JOIN fqs_test_mod1 t2 on (t1.id = t2.id) WHERE t1.id = $1;EXPLAIN verbose execute s_table_join6(3);
261张hash表,1张复制表表,join条件是分片键,join的类型是全连接,WHERE的条件是分片键或非分片键“=”条件且参数是静态或动态绑定变量的,不带排序的/带排序的,不支持FQSEXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_hash1 t1 FULL OUTER JOIN fqs_test_repl1 t2 on (t1.id = t2.id) WHERE t1.id =3;prepare s_table_join9(int) as SELECT t1.id, t1.name FROM fqs_test_hash1 t1 FULL OUTER JOIN fqs_test_repl1 t2 on (t1.id = t2.id) WHERE t1.id = $1;EXPLAIN verbose execute s_table_join9(3);
271张按hash分布的表,1张按random分布的表,join的条件是分片键, join的类型是内连接、左连接、全连接,WHERE的条件是分片键或非分片键“=”条件且参数是静态或动态绑定变量的,不带排序的/带排序的,不支持FQSEXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_hash1 t1 inner join fqs_test_random1 t2 on (t1.id = t2.id) WHERE t1.id =3;EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_hash1 t1 left outer join fqs_test_random1 t2 on (t1.id = t2.id) WHERE t1.id =3;EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_hash1 t1 FULL OUTER JOIN fqs_test_random1 t2 on (t1.id = t2.id) WHERE t1.id =3;prepare s_table_join10(int) as SELECT t1.id, t1.name FROM fqs_test_hash1 t1 inner join fqs_test_random1 t2 on (t1.id = t2.id) WHERE t1.id = $1;EXPLAIN verbose execute s_table_join10(3);prepare s_table_join11(int) as SELECT t1.id, t1.name FROM fqs_test_hash1 t1 left outer join fqs_test_random1 t2 on (t1.id = t2.id) WHERE t1.id = $1;EXPLAIN verbose execute s_table_join11(3);prepare s_table_join12(int) as SELECT t1.id, t1.name FROM fqs_test_hash1 t1 FULL OUTER JOIN fqs_test_random1 t2 on (t1.id = t2.id) WHERE t1.id = $1;EXPLAIN verbose execute s_table_join12(3);
281张取mod分布的表,1张按hash分布的表, join的条件是分片键, join的类型是内连接、左连接、全连接,WHERE的条件是分片键或非分片键“=”条件且参数是静态或动态绑定变量的,不带排序的/带排序的,不支持FQSEXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_mod1 t1 inner join fqs_test_hash1 t2 on (t1.id = t2.id) WHERE t1.id =3;EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_mod1 t1 left outer join fqs_test_hash1 t2 on (t1.id = t2.id) WHERE t1.id =3;EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_mod1 t1 FULL OUTER JOIN fqs_test_hash1 t2 on (t1.id = t2.id) WHERE t1.id =3;prepare s_table_join13(int) as SELECT t1.id, t1.name FROM fqs_test_mod1 t1 inner join fqs_test_hash1 t2 on (t1.id = t2.id) WHERE t1.id = $1;EXPLAIN verbose execute s_table_join13(3);prepare s_table_join14(int) as SELECT t1.id, t1.name FROM fqs_test_mod1 t1 left outer join fqs_test_hash1 t2 on (t1.id = t2.id) WHERE t1.id = $1;EXPLAIN verbose execute s_table_join14(3);prepare s_table_join15(int) as SELECT t1.id, t1.name FROM fqs_test_mod1 t1 FULL OUTER JOIN fqs_test_hash1 t2 on (t1.id = t2.id) WHERE t1.id = $1;EXPLAIN verbose execute s_table_join15(3);
291张取mod分布的表,1张复制表, join的条件是分片键, join的类型是全连接,WHERE的条件是分片键或非分片键“=”条件且参数是静态或动态绑定变量的,不带排序的/带排序的,不支持FQSEXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_mod1 t1 FULL OUTER JOIN fqs_test_repl1 t2 on (t1.id = t2.id) WHERE t1.id =3;prepare s_table_join21(int) as SELECT t1.id, t1.name FROM fqs_test_mod1 t1 FULL OUTER JOIN fqs_test_repl1 t2 on (t1.id = t2.id) WHERE t1.id = $1;EXPLAIN verbose execute s_table_join21(3);
301张取mod分布的表,1张按random分布的表,join的条件是分片键, join的类型是内连接、左连接、全连接,WHERE的条件是分片键或非分片键“=”条件且参数是静态或动态绑定变量的,不带排序的/带排序的,不支持FQSEXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_mod1 t1 inner join fqs_test_random1 t2 on (t1.id = t2.id) WHERE t1.id =3;EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_mod1 t1 left outer join fqs_test_random1 t2 on (t1.id = t2.id) WHERE t1.id =3;EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_mod1 t1 FULL OUTER JOIN fqs_test_random1 t2 on (t1.id = t2.id) WHERE t1.id =3;prepare s_table_join22(int) as SELECT t1.id, t1.name FROM fqs_test_mod1 t1 inner join fqs_test_random1 t2 on (t1.id = t2.id) WHERE t1.id = $1;EXPLAIN verbose execute s_table_join22(3);prepare s_table_join23(int) as SELECT t1.id, t1.name FROM fqs_test_mod1 t1 left outer join fqs_test_random1 t2 on (t1.id = t2.id) WHERE t1.id = $1;EXPLAIN verbose execute s_table_join23(3);prepare s_table_join24(int) as SELECT t1.id, t1.name FROM fqs_test_mod1 t1 FULL OUTER JOIN fqs_test_random1 t2 on (t1.id = t2.id) WHERE t1.id = $1;EXPLAIN verbose execute s_table_join24(3);
311张复制表,1张按hash分布的表,join条件是分片键,join的类型是左连接、全连接,WHERE的条件是分片键或非分片键“=”条件且参数是静态或动态绑定变量的,不带排序的/带排序的,不支持FQSEXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_repl1 t1 left outer join fqs_test_hash1 t2 on (t1.id = t2.id) WHERE t1.id =3;EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_repl1 t1 FULL OUTER JOIN fqs_test_hash1 t2 on (t1.id = t2.id) WHERE t1.id =3;prepare s_table_join26(int) as SELECT t1.id, t1.name FROM fqs_test_repl1 t1 left outer join fqs_test_hash1 t2 on (t1.id = t2.id) WHERE t1.id = $1;EXPLAIN verbose execute s_table_join26(3);prepare s_table_join27(int) as SELECT t1.id, t1.name FROM fqs_test_repl1 t1 FULL OUTER JOIN fqs_test_hash1 t2 on (t1.id = t2.id) WHERE t1.id = $1;EXPLAIN verbose execute s_table_join27(3);
321张复制表,1张取mod分布的表,join 条件是分片键,join 的类型是左连接、全连接,WHERE 的条件是分片键或非分片键“=”条件且参数是静态或动态绑定变量的,不带排序的/带排序的,不支持FQSEXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_repl1 t1 left outer join fqs_test_mod1 t2 on (t1.id = t2.id) WHERE t1.id =3;EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_repl1 t1 FULL OUTER JOIN fqs_test_mod1 t2 on (t1.id = t2.id) WHERE t1.id =3;prepare s_table_join29(int) as SELECT t1.id, t1.name FROM fqs_test_repl1 t1 left outer join fqs_test_mod1 t2 on (t1.id = t2.id) WHERE t1.id = $1;EXPLAIN verbose execute s_table_join29(3);prepare s_table_join30(int) as SELECT t1.id, t1.name FROM fqs_test_repl1 t1 FULL OUTER JOIN fqs_test_mod1 t2 on (t1.id = t2.id) WHERE t1.id = $1;EXPLAIN verbose execute s_table_join30(3);
331 张复制表,1 张按random 分布的表,join 条件是分片键,join 的类型是左连接、全连接,WHERE 的条件是分片键或非分片键“=”条件且参数是静态或动态绑定变量的,带/不带排序的,不支持FQSEXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_repl1 t1 left outer join fqs_test_random1 t2 on (t1.id = t2.id) WHERE t1.id =3;EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_repl1 t1 FULL OUTER JOIN fqs_test_random1 t2 on (t1.id = t2.id) WHERE t1.id =3;prepare s_table_join35(int) as SELECT t1.id, t1.name FROM fqs_test_repl1 t1 left outer join fqs_test_random1 t2 on (t1.id = t2.id) WHERE t1.id = $1;EXPLAIN verbose execute s_table_join35(3);prepare s_table_join36(int) as SELECT t1.id, t1.name FROM fqs_test_repl1 t1 FULL OUTER JOIN fqs_test_random1 t2 on (t1.id = t2.id) WHERE t1.id = $1;EXPLAIN verbose execute s_table_join36(3);
341张按random分布的表,1张按hash分布的表,join的条件是分片键, join的类型是内连接、左连接、全连接,WHERE的条件是分片键或非分片键“=”条件且参数是静态或动态绑定变量的,不带排序的/带排序的,不支持FQSEXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_random1 t1 inner join fqs_test_hash1 t2 on (t1.id = t2.id) WHERE t1.id =3;EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_random1 t1 left outer join fqs_test_hash1 t2 on (t1.id = t2.id) WHERE t1.id =3;EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_random1 t1 FULL OUTER JOIN fqs_test_hash1 t2 on (t1.id = t2.id) WHERE t1.id =3;prepare s_table_join37(int) as SELECT t1.id, t1.name FROM fqs_test_random1 t1 inner join fqs_test_hash1 t2 on (t1.id = t2.id) WHERE t1.id = $1;EXPLAIN verbose execute s_table_join37(3);prepare s_table_join38(int) as SELECT t1.id, t1.name FROM fqs_test_random1 t1 left outer join fqs_test_hash1 t2 on (t1.id = t2.id) WHERE t1.id = $1;EXPLAIN verbose execute s_table_join38(3);prepare s_table_join39(int) as SELECT t1.id, t1.name FROM fqs_test_random1 t1 FULL OUTER JOIN fqs_test_hash1 t2 on (t1.id = t2.id) WHERE t1.id = $1;EXPLAIN verbose execute s_table_join39(3);
351张按random分布的表,1张取mod分布的表,join的条件是分片键, join的类型是内连接、左连接、全连接,WHERE的条件是分片键或非分片键“=”条件且参数是静态或动态绑定变量的,不带排序的/带排序的,不支持FQSEXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_random1 t1 inner join fqs_test_mod1 t2 on (t1.id = t2.id) WHERE t1.id =3;EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_random1 t1 left outer join fqs_test_mod1 t2 on (t1.id = t2.id) WHERE t1.id =3;EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_random1 t1 FULL OUTER JOIN fqs_test_mod1 t2 on (t1.id = t2.id) WHERE t1.id =3;prepare s_table_join40(int) as SELECT t1.id, t1.name FROM fqs_test_random1 t1 inner join fqs_test_mod1 t2 on (t1.id = t2.id) WHERE t1.id = $1;EXPLAIN verbose execute s_table_join40(3);prepare s_table_join41(int) as SELECT t1.id, t1.name FROM fqs_test_random1 t1 left outer join fqs_test_mod1 t2 on (t1.id = t2.id) WHERE t1.id = $1;EXPLAIN verbose execute s_table_join41(3);prepare s_table_join42(int) as SELECT t1.id, t1.name FROM fqs_test_random1 t1 FULL OUTER JOIN fqs_test_mod1 t2 on (t1.id = t2.id) WHERE t1.id = $1;EXPLAIN verbose execute s_table_join42(3);
361张按random分布的表,1张复制表,join的条件是分片键, join的类型是全连接,WHERE的条件是分片键或非分片键“=”条件且参数是静态或动态绑定变量的,不带排序的/带排序的,不支持FQSEXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_random1 t1 FULL OUTER JOIN fqs_test_repl1 t2 on (t1.id = t2.id) WHERE t1.id =3;prepare s_table_join45(int) as SELECT t1.id, t1.name FROM fqs_test_random1 t1 FULL OUTER JOIN fqs_test_repl1 t2 on (t1.id = t2.id) WHERE t1.id = $1;EXPLAIN verbose execute s_table_join45(3);
371张按random分布的表,1张按random分布的表,join的条件是分片键, join的类型是内连接、左连接、全连接,WHERE的条件是分片键或非分片键“=”条件且参数是静态或动态绑定变量的,不带排序的/带排序的,不支持FQSEXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_random1 t1 inner join fqs_test_random2 t2 on (t1.id = t2.id) WHERE t1.id =3;EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_random1 t1 left outer join fqs_test_random2 t2 on (t1.id = t2.id) WHERE t1.id =3;EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_random1 t1 FULL OUTER JOIN fqs_test_random2 t2 on (t1.id = t2.id) WHERE t1.id =3;prepare s_table_join46(int) as SELECT t1.id, t1.name FROM fqs_test_random1 t1 inner join fqs_test_random2 t2 on (t1.id = t2.id) WHERE t1.id = $1;EXPLAIN verbose execute s_table_join46(3);prepare s_table_join47(int) as SELECT t1.id, t1.name FROM fqs_test_random1 t1 left outer join fqs_test_random2 t2 on (t1.id = t2.id) WHERE t1.id = $1;EXPLAIN verbose execute s_table_join47(3);prepare s_table_join48(int) as SELECT t1.id, t1.name FROM fqs_test_random1 t1 FULL OUTER JOIN fqs_test_random2 t2 on (t1.id = t2.id) WHERE t1.id = $1;EXPLAIN verbose execute s_table_join48(3);
38SQL语句中分片键包含一个=变量的 比如:a=$1+1、mod($1,5)这种不支持,可确定最终只会在一个datanode上执行, 不支持FQSCREATE TABLE bmsql_new_order ( no_w_id integer not null, no_d_id integer not null, no_o_id integer not null) distribute by hash(no_w_id);prepare s10(int) as SELECT no_w_id FROM bmsql_new_order WHERE no_w_id = $1+1 and no_d_id = 1 ;EXPLAIN (verbose) execute s10(1);
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论