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 | 不支持 | |||
| 3 | insert 的SQL语句,分布表的带nextval序列等动态函数的,WHERE条件里面带= 分布键 | insert 的SQL语句,分布表的带nextval序列等动态函数的,WHERE条件里面带= 分布键 | 不支持 | |
| 4 | update 的SQL语句,分布表的带nextval序列等动态函数的,WHERE条件里面带= 分布键 | update 的SQL语句,分布表的带nextval序列等动态函数的,WHERE条件里面带= 分布键 | 不支持 | |
| 5 | 右连接 不支持 FQS | 右连接 不支持 FQS | 不支持 | |
| 6 | 表有多个分片键的不支持FQS | 不支持 | ||
| 7 | ora连接的(query->connect_by),不支持FQS | 不支持 | ||
| 8 | 触发器、规则,不支持FQS | 基本不支持,rule会在rewrite的时候会导致语句添加某些不满足ship的条件 | ||
| 9 | with子句的,不支持FQS | 不支持 | ||
| 10 | 有子链接的(query->hasSubLinks),且执行节点不是复制表且其子查询也不是复制表的,不支持FQS | 不支持 | ||
| 11 | 单节点表达式:执行节点数量不等于1,且非单点表达式的且不是复制表 | 不支持ok | ||
| 12 | insert 且表达式是返回set的(expression_returns_set) 或表达式有序列不支持FQS | 不支持 | ||
| 13 | 是插入或更新的语句,且是复制表的,且目标列有序列表达式的,不支持FQS | 不支持 | ||
| 14 | insert且是分布表的: | 1)分布键不是1个的,返回NULL ,不支持FQS | 不支持 | |
| 2)分布键是1个的,且target里面不包含分布列的,返回NULL ,不支持FQS | 不支持 | |||
| 15 | RTE不支持FQS | 1)RTE_JOIN 不支持FQS | 不支持 | |
| 2)RTE_CTE 不支持FQS | 不支持 | |||
| 3)RTE_FUNCTION 不支持FQS | 不支持 | |||
| 4)RTE_VALUES 不支持FQS | 不支持 | |||
| 16 | 有不支持的表达式的,只能在cn节点上执行的表达式等,具体的表达式见下面:不支持FQS | 1) 有不支持的表达式的 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_VARLEVEL | a.是子查询引用外层语句的列(sc_context->sc_max_varlevelsup != 0) | 不支持 | ||
| 6)SS_UNSHIPPABLE_TRIGGER | a.节点是T_Query且sql命令是insert、update、delete 且是不可透传的触发器(!pgxc_check_triggers_shippability(rte->relid,query->commandType)) | 不支持 | ||
| 7)SS_UNSHIPPABLE_RELATION | a. 节点是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 | 右连接 不支持 FQS | EXPLAIN (verbose) SELECT EMP_ID, NAME, DEPT FROM FQS_COMPANY RIGHT OUTER JOIN FQS_DEPARTMENT ON FQS_COMPANY.ID = FQS_DEPARTMENT.ID; |
| 2 | 左连接2表on的条件都包含分片键的且有排序的(按分片键排序或其他键排序),不支持 FQS | EXPLAIN (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的条件都包含分片键的且有排序的(按分片键排序或其他键排序),不支持 FQS | EXPLAIN (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; |
| 4 | insert 的SQL语句,分布表的带nextval序列等动态函数的,insert条件里面带分布键,分布键是静态参数或动态绑定变量参数的,不支持 FQS | PREPARE 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')); |
| 5 | update 的SQL语句,分布表的带nextval序列等动态函数的,insert条件里面带分布键,分布键是静态参数或动态绑定变量参数的,不支持 FQS | PREPARE 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; |
| 6 | Insert to one DN node,RTE不支持(批量插入)FQS | EXPLAIN verbose INSERT INTO fqs_t_DN1 VALUES(5,1,'111'),(6,2,'22'),(7,3,'33'),(8,4,'444'); |
| 7 | 关联子查询不支持FQS | CREATE 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 | 随机分布的表支持单表查询,条件中包含分片键且是静态常量的,有排序的,排序键是分片键或非分片键的,不支持FQS | EXPLAIN (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节点的,不支持FQS | PREPARE 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); |
| 11 | 1张按hash分布的表,1张取mod分布的表,join的条件是分布键,有或者没有排序,join的类型是内连接、左连接、全连接,不支持FQS | EXPLAIN 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); |
| 12 | 1张按hash分布的表,1张复制表,join的条件是分布键,有或者没有排序,join的类型是全连接,不带WHERE条件,不支持FQS | EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_hash1 t1 FULL OUTER JOIN fqs_test_repl1 t2 on (t1.id = t2.id); |
| 13 | 1张按hash分布的表,1张按random分布的表,join的条件是分布键,有或者没有排序,join的类型是内连接、左连接、全连接,不带WHERE条件,不支持FQS | EXPLAIN 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); |
| 14 | 1张取mod分布的表,1张按hash分布的表,join的条件是分布键,有或者没有排序,join的类型是内连接、左连接、全连接,不带WHERE条件,不支持FQS | EXPLAIN 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); |
| 15 | 1张取mod分布的表,1张复制表,join的条件是分片键,有或没有排序,join的类型是全连接,不带WHERE条件,不支持FQS | EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_mod1 t1 FULL OUTER JOIN fqs_test_repl1 t2 on (t1.id = t2.id); |
| 16 | 1张取mod分布的表,1张按random分布的表,join的条件是分片键,有或没有排序,join的类型是内连接、左连接、全连接,不带WHERE条件,不支持FQS | EXPLAIN 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); |
| 17 | 1张复制表,一张按hash分布的表,join的条件是分片键,有或没有排序,join的类型是左连接、全连接,不带WHERE条件,不支持FQS | EXPLAIN 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); |
| 18 | 1张复制表,一张取mod分布的表,join的条件是分片键,有或没有排序,join的类型是左连接、全连接,不带WHERE条件,不支持FQS | EXPLAIN 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); |
| 19 | 1张复制表,1张按random分布的表,join的条件是分片键,join的类型是内连接,带排序,不支持FQS | EXPLAIN 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; |
| 20 | 1张复制表,1张按random分布的表,join的条件是分片键,join的类型是左连接、全连接,带或不带排序,不支持FQS | EXPLAIN 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); |
| 21 | 1张按random分布的表,1张按hash分布的表,join的条件是分片键,join的类型是内连接、左连接、全连接,不带排序/带排序,不带WHERE条件,不支持FQS | EXPLAIN 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); |
| 22 | 1张按random分布的表,1张取mod分布的表, join的条件是分片键,有或没有排序,join的类型是内连接、左连接、全连接,不带WHERE条件,不支持FQS | EXPLAIN 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); |
| 23 | 1张按random分布的表,1张复制表,join的条件是分片键,join的类型是全连接,不带排序/带排序,不带WHERE条件,不支持FQS | EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_random1 t1 FULL OUTER JOIN fqs_test_repl1 t2 on (t1.id = t2.id); |
| 24 | 1张按random分布的表,1张按random分布的表,join的条件是随意,join的类型是内连接、左连接、全连接,不带排序/带排序,不带WHERE条件,不支持FQS | EXPLAIN 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); |
| 25 | 1张hash表,1张取mod分布的表,join条件是分片键,join的类型是内连接、左连接、全连接,WHERE的条件是分片键或非分片键“=”条件且参数是静态或动态绑定变量的,不带排序的/带排序的,都不支持FQS | EXPLAIN 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); |
| 26 | 1张hash表,1张复制表表,join条件是分片键,join的类型是全连接,WHERE的条件是分片键或非分片键“=”条件且参数是静态或动态绑定变量的,不带排序的/带排序的,不支持FQS | EXPLAIN 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); |
| 27 | 1张按hash分布的表,1张按random分布的表,join的条件是分片键, join的类型是内连接、左连接、全连接,WHERE的条件是分片键或非分片键“=”条件且参数是静态或动态绑定变量的,不带排序的/带排序的,不支持FQS | EXPLAIN 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); |
| 28 | 1张取mod分布的表,1张按hash分布的表, join的条件是分片键, join的类型是内连接、左连接、全连接,WHERE的条件是分片键或非分片键“=”条件且参数是静态或动态绑定变量的,不带排序的/带排序的,不支持FQS | EXPLAIN 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); |
| 29 | 1张取mod分布的表,1张复制表, join的条件是分片键, join的类型是全连接,WHERE的条件是分片键或非分片键“=”条件且参数是静态或动态绑定变量的,不带排序的/带排序的,不支持FQS | EXPLAIN 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); |
| 30 | 1张取mod分布的表,1张按random分布的表,join的条件是分片键, join的类型是内连接、左连接、全连接,WHERE的条件是分片键或非分片键“=”条件且参数是静态或动态绑定变量的,不带排序的/带排序的,不支持FQS | EXPLAIN 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); |
| 31 | 1张复制表,1张按hash分布的表,join条件是分片键,join的类型是左连接、全连接,WHERE的条件是分片键或非分片键“=”条件且参数是静态或动态绑定变量的,不带排序的/带排序的,不支持FQS | EXPLAIN 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); |
| 32 | 1张复制表,1张取mod分布的表,join 条件是分片键,join 的类型是左连接、全连接,WHERE 的条件是分片键或非分片键“=”条件且参数是静态或动态绑定变量的,不带排序的/带排序的,不支持FQS | EXPLAIN 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); |
| 33 | 1 张复制表,1 张按random 分布的表,join 条件是分片键,join 的类型是左连接、全连接,WHERE 的条件是分片键或非分片键“=”条件且参数是静态或动态绑定变量的,带/不带排序的,不支持FQS | EXPLAIN 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); |
| 34 | 1张按random分布的表,1张按hash分布的表,join的条件是分片键, join的类型是内连接、左连接、全连接,WHERE的条件是分片键或非分片键“=”条件且参数是静态或动态绑定变量的,不带排序的/带排序的,不支持FQS | EXPLAIN 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); |
| 35 | 1张按random分布的表,1张取mod分布的表,join的条件是分片键, join的类型是内连接、左连接、全连接,WHERE的条件是分片键或非分片键“=”条件且参数是静态或动态绑定变量的,不带排序的/带排序的,不支持FQS | EXPLAIN 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); |
| 36 | 1张按random分布的表,1张复制表,join的条件是分片键, join的类型是全连接,WHERE的条件是分片键或非分片键“=”条件且参数是静态或动态绑定变量的,不带排序的/带排序的,不支持FQS | EXPLAIN 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); |
| 37 | 1张按random分布的表,1张按random分布的表,join的条件是分片键, join的类型是内连接、左连接、全连接,WHERE的条件是分片键或非分片键“=”条件且参数是静态或动态绑定变量的,不带排序的/带排序的,不支持FQS | EXPLAIN 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); |
| 38 | SQL语句中分片键包含一个=变量的 比如:a=$1+1、mod($1,5)这种不支持,可确定最终只会在一个datanode上执行, 不支持FQS | CREATE 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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




