报错:4020 No join order generated

【 使用环境 】生产环境
【 OB or 其他组件 】OB
【 使用版本 】5.7.25-OceanBase_CE-v4.3.5.2
【问题描述】执行sql报错:
4020 No join order generated
sql内容如下:

SELECT 
	T201.diag_module AS F185,
	T24.diagnostician_id AS F0,
	T25.diagnostician_type_id AS F2,
	T25.diagnostician_type_name AS F3,
 T454.grade_id AS F423,
 T454.grade_name AS F424,
 T454.grade_show_seq AS F425,
 T454.grade_type_id AS F426,
 T454.grade_type_name AS F427,
 T454.grade_type_show_seq AS F428,
 T56310.school_area_id AS F56169,
 T56310.school_area_name AS F56170,
 T56310.school_area_show_seq AS F56171
FROM
	dw_actual_answer_naire_question T203
INNER JOIN dw_question T190 ON T203.q_id = T190.q_id
INNER JOIN dw_diag_module T201 ON T190.diag_module = T201.diag_module
INNER JOIN dw_diag_obj T191 ON T203.diag_obj_id = T191.diag_obj_id
AND T203.school_code = T191.school_code
AND T203.school_term_id = T191.school_term_id
INNER JOIN dw_school_term T27 ON T191.school_term_id = T27.school_term_id
INNER JOIN dw_school T28 ON T28.school_code = T191.school_code
INNER JOIN dw_diag_obj_rpt_tag T198 ON T191.diag_obj_id = T198.diag_obj_id
INNER JOIN dw_diag_obj_type T199 ON T191.diag_obj_type_id = T199.diag_obj_type_id
INNER JOIN dw_diagnostician T24 ON T203.diagnostician_id = T24.diagnostician_id
AND T203.school_code = T24.school_code
AND T203.school_term_id = T24.school_term_id
INNER JOIN dw_tician_type T29 ON T29.diagnostician_id = T24.diagnostician_id
INNER JOIN dw_diagnostician_type T25 ON T29.diagnostician_type_id = T25.diagnostician_type_id
INNER JOIN dw_tician_grade T454 ON T24.diagnostician_id = T454.diagnostician_id
INNER JOIN dw_tician_school_area T56310 ON T24.diagnostician_id = T56310.diagnostician_id
WHERE
	T28.school_code IN ('bj8z', 'ceshi2')
AND T27.school_term_id IN ('2521')
AND T201.diag_module IN (
	'组织与领导-专项诊断'
)
AND T203.school_code IN ('bj8z', 'ceshi2')
AND T199.diag_obj_type_id IN ('JXBYB')
AND T198.rpt_tag IN ('全部')
AND T25.diagnostician_type_id IN ('JZG')
1 个赞

在mysql数据库中执行没有问题,但在oceanbase中报这个错误了

SHOW VARIABLES like ‘version_comment’;
alter system set enable_rich_error_msg=true;
obclient [test]> select count(*) from t2;
ERROR 1146 (42S02): Table ‘test.t2’ doesn’t exist
[xx.xx.xx.1:2882] [2024-04-13 20:10:20.292087] [YB420BA1CC68-000615A0A8EA5E38-0-0]
[root@x.x.x.1 ~]$ grep “YB420BA1CC68-000615A0A8EA5E38-0-0” rootservice.log
[root@x.x.x.1 ~]$ grep “YB420BA1CC68-000615A0A8EA5E38-0-0” observer.log
alter system set enable_rich_error_msg=false;

version_comment OceanBase_CE 4.3.5.2 (r102010012025052715-2291c2a4ef1863f12286914f6bb56108fb7bc25c) (Built May 27 2025 15:15:24)

执行:alter system set enable_rich_error_msg=true;
提示 5099 system config unknown

a. 登录系统租户,打开enable_rich_error_msg 参数
b. 登录业务租户,执行报错 SQL 语句,会直接返回执行节点 IP 和 trace_id 信息。
c. 去 xx.xx.xx.1 节点过滤日志,如果最新日志无法过滤到,可以正则匹配多个日志进行过滤
d. 获取完日志信息后,关闭enable_rich_error_msg参数

您好,显示是空的

遍历的所有observer.的日志,还都是空的。是按照步骤执行的

麻烦仔细看我的发的信息 这一步要执行你那个报错的语句 我这是个举例 你用我这个trace_id 肯定搜不到的

select 后加上 /*+ NO_REWRITE */ 禁止 SQL 改写 ,执行不报错

还是要搜集一下 日志信息的 表结构也提供一下 explain extended执行计划也提供一下 要不然不确定什么问题导致的

[root@localhost log]# grep “YB42C0A80040-0006441F1E7CE10A-0-0” observer.log
[2025-12-04 15:28:00.602394] WDIAG [SQL.OPT] generate_join_orders (ob_log_plan.cpp:370) [2788][T1004_L0_G0][T1004][YB42C0A80040-0006441F1E7CE10A-0-0] [lt=55][errcode=-4240] No final JoinOrder generated(ret=-4240, join_level=13, join_rels.at(join_level -1).count()=0)
[2025-12-04 15:28:00.602423] WDIAG [SQL.OPT] generate_plan_tree (ob_log_plan.cpp:7100) [2788][T1004_L0_G0][T1004][YB42C0A80040-0006441F1E7CE10A-0-0] [lt=26][errcode=-4240] failed to generate the access path for the single-table query(ret=-4240, get_optimizer_context().get_query_ctx()->get_sql_stmt()=SELECT
[2025-12-04 15:28:00.602435] WDIAG [SQL.OPT] generate_raw_plan_for_plain_select (ob_select_log_plan.cpp:5480) [2788][T1004_L0_G0][T1004][YB42C0A80040-0006441F1E7CE10A-0-0] [lt=11][errcode=-4240] failed to generate plan tree for plain select(ret=-4240)
[2025-12-04 15:28:00.602441] WDIAG [SQL.OPT] generate_raw_plan (ob_log_plan.cpp:11516) [2788][T1004_L0_G0][T1004][YB42C0A80040-0006441F1E7CE10A-0-0] [lt=5][errcode=-4240] fail to generate normal raw plan(ret=-4240)
[2025-12-04 15:28:00.602445] WDIAG [SQL.OPT] generate_plan (ob_log_plan.cpp:11473) [2788][T1004_L0_G0][T1004][YB42C0A80040-0006441F1E7CE10A-0-0] [lt=4][errcode=-4240] fail to generate raw plan(ret=-4240)
[2025-12-04 15:28:00.602450] WDIAG [SQL.OPT] optimize (ob_optimizer.cpp:53) [2788][T1004_L0_G0][T1004][YB42C0A80040-0006441F1E7CE10A-0-0] [lt=4][errcode=-4240] failed to perform optimization(ret=-4240)
[2025-12-04 15:28:00.602456] WDIAG [SQL] optimize_stmt (ob_sql.cpp:3861) [2788][T1004_L0_G0][T1004][YB42C0A80040-0006441F1E7CE10A-0-0] [lt=4][errcode=-4240] Failed to optimize logical plan(ret=-4240)
[2025-12-04 15:28:00.602461] WDIAG [SQL] generate_plan (ob_sql.cpp:3489) [2788][T1004_L0_G0][T1004][YB42C0A80040-0006441F1E7CE10A-0-0] [lt=4][errcode=-4240] Failed to optimizer stmt(ret=-4240)
[2025-12-04 15:28:00.602465] INFO [SQL] generate_plan (ob_sql.cpp:3542) [2788][T1004_L0_G0][T1004][YB42C0A80040-0006441F1E7CE10A-0-0] [lt=4] [SQL MEM USAGE] use too much memory(total_mem_used=84541440, ObString(parse_result.input_sql_len_, parse_result.input_sql_)=SELECT
[2025-12-04 15:28:00.602532] WDIAG [SQL] generate_physical_plan (ob_sql.cpp:3276) [2788][T1004_L0_G0][T1004][YB42C0A80040-0006441F1E7CE10A-0-0] [lt=6][errcode=-4240] failed to generate plan(ret=-4240)
[2025-12-04 15:28:00.602546] WDIAG [SQL] handle_physical_plan (ob_sql.cpp:5264) [2788][T1004_L0_G0][T1004][YB42C0A80040-0006441F1E7CE10A-0-0] [lt=10][errcode=-4240] Failed to generate plan(ret=-4240, result.get_exec_context().need_disconnect()=false)
[2025-12-04 15:28:00.602553] WDIAG [SQL] handle_text_query (ob_sql.cpp:2829) [2788][T1004_L0_G0][T1004][YB42C0A80040-0006441F1E7CE10A-0-0] [lt=5][errcode=-4240] fail to handle physical plan(ret=-4240)
[2025-12-04 15:28:00.602559] WDIAG [SQL] stmt_query (ob_sql.cpp:174) [2788][T1004_L0_G0][T1004][YB42C0A80040-0006441F1E7CE10A-0-0] [lt=5][errcode=-4240] fail to handle text query(stmt=SELECT
[2025-12-04 15:28:00.602571] WDIAG [SERVER] after_func (ob_query_retry_ctrl.cpp:1076) [2788][T1004_L0_G0][T1004][YB42C0A80040-0006441F1E7CE10A-0-0] [lt=7][errcode=-4240] [RETRY] check if need retry(v={force_local_retry:false, stmt_retry_times:0, local_retry_times:0, err_:-4240, err_:“OB_ERR_NO_JOIN_ORDER_GENERATED”, retry_type:0, client_ret:-4240}, need_retry=false)
[2025-12-04 15:28:00.602586] WDIAG [SERVER] do_process (obmp_query.cpp:1090) [2788][T1004_L0_G0][T1004][YB42C0A80040-0006441F1E7CE10A-0-0] [lt=14][errcode=-4240] run stmt_query failed, check if need retry(ret=-4240, cli_ret=-4240, retry_ctrl_.need_retry()=0, sql=SELECT
[2025-12-04 15:28:00.602596] WDIAG [SERVER] do_process (obmp_query.cpp:1216) [2788][T1004_L0_G0][T1004][YB42C0A80040-0006441F1E7CE10A-0-0] [lt=7][errcode=-4240] query failed(ret=-4240, session={this:0x7f08706f3a98, id:3221937949, deser:false, tenant:“tt_edu”, tenant_id:1004, effective_tenant:“tt_edu”, effective_tenant_id:1004, database:“edu_dw”, user:“edudiagnose@%”, consistency_level:3, session_state:2, autocommit:true, tx:0x7f10235a1620}, sql=SELECT
[2025-12-04 15:28:00.602623] INFO [SERVER] send_error_packet (obmp_packet_sender.cpp:376) [2788][T1004_L0_G0][T1004][YB42C0A80040-0006441F1E7CE10A-0-0] [lt=20] sending error packet(ob_error=-4240, client error=-4240, extra_err_info=NULL, lbt()=“0x2644d88d 0x1303b050 0x12fe23ec 0x92bad15 0x92a5f03 0x929ef9d 0x928c144 0x13217099 0x260d8d52 0x7f115c2a7ea5 0x7f115bfd0b0d”)
[2025-12-04 15:28:00.602663] INFO [SERVER] send_error_packet (obmp_packet_sender.cpp:579) [2788][T1004_L0_G0][T1004][YB42C0A80040-0006441F1E7CE10A-0-0] [lt=7] dump txn free route audit_record(value=1048581, session->get_server_sid()=3221937949, session->get_proxy_sessid()=13882479996272103764)
[2025-12-04 15:28:00.602678] WDIAG [SQL] move_to_sqlstat_cache (ob_sql_stat_record.cpp:366) [2788][T1004_L0_G0][T1004][YB42C0A80040-0006441F1E7CE10A-0-0] [lt=13][errcode=0] the key is not valid which at plan cache mgr(ret=0, ret=“OB_SUCCESS”)
[2025-12-04 15:28:00.602728] WDIAG [SQL.PC] common_free (ob_lib_cache_object_manager.cpp:139) [2788][T1004_L0_G0][T1004][YB42C0A80040-0006441F1E7CE10A-0-0] [lt=5][errcode=0] set logical del time(cache_obj->get_logical_del_time()=4290121049771, cache_obj->added_lc()=false, cache_obj->get_object_id()=72327, cache_obj->get_tenant_id()=1004, lbt()=“0x2644d88d 0x1943e08e 0x92c2608 0x92b3dc5 0x92a5f03 0x929ef9d 0x928c144 0x13217099 0x260d8d52 0x7f115c2a7ea5 0x7f115bfd0b0d”)
[2025-12-04 15:28:00.602836] WDIAG [SERVER.OMT] process_one (ob_worker_processor.cpp:82) [2788][T1004_L0_G0][T1004][YB42C0A80040-0006441F1E7CE10A-0-0] [lt=4][errcode=-4240] process request fail(ret=-4240)
[2025-12-04 15:28:00.602842] WDIAG [SERVER.OMT] process (ob_worker_processor.cpp:160) [2788][T1004_L0_G0][T1004][YB42C0A80040-0006441F1E7CE10A-0-0] [lt=5][errcode=-4240] process request fail(ret=-4240)

也报错

好的 我们先分析一下 看看具体的问题

/* 连接数据库,开启当前 Session 的优化器追踪功能 */
obclient> CALL DBMS_XPLAN.ENABLE_OPT_TRACE();
Query OK, 0 rows affected

/* 设置追踪日志的 Level 和日志文件后缀 */
obclient> CALL DBMS_XPLAN.SET_OPT_TRACE_PARAMETER(identifier=>‘trace_test’, level=>3);
Query OK, 0 rows affected

/* 执行查询 */
obclient> SELECT * FROM t1;
Empty set

/* 在 OBServer 节点日志目录下查看 trace_test 为后缀的追踪日志 */
vi /data/1/observer/log/optimizer_trace_BkkGn1_trace_test.trac

/* 关闭当前 Session 的优化器追踪功能 */
obclient> CALL DBMS_XPLAN.DISABLE_OPT_TRACE();;
Query OK, 0 rows affected

这个在哪个目录下呢,在oceanbase/log目录下没有生成文件

image
我们测试发现在navicate中去掉这两个条件可以正常执行

你用find查找一下 看看这个文件在哪个目录下 一般情况下 就在这个在 OBServer 节点日志目录下

optimizer_trace_KWS0u3_trace_test.7z (1.1 MB)
请见附件

改写会把部分连接条件消掉变成笛卡尔积,触发了后续 join order 枚举的 bug。可以先加 no_rewrite 规避

你们的服务器架构是x86的么