问题现象
SQL 带有窗口函数(例如 ROW_NUMBER () OVER()),在主库执行偶发报错 -4016,在备库执行必定报错 -4016,且关键日志有打印 failed to check column in current level stmt(ret=-4016)。
[2024-10-22 09:26:55.654966] WARN [SQL.OPT] calculate_distinct (ob_opt_selectivity.cpp:3624) [80486][0][xxxxx-xxxxx-xxxxx-xxxxx] [lt=9] [dc=0] failed to check column in current level stmt(ret=-4016)
问题原因
远程执行计划的计划改写错误,导致报错 -4016,因为备库上的 SQL 为远程执行计划所以一定会执行失败,而主库上 OBProxy 可能会将连接路由到远程节点生成远程执行计划,所以主库查询会偶发执行失败。
问题的风险及影响
主库上特定语句偶发执行失败,备库上特定语句执行必定失败。
影响租户
影响 OceanBase 数据库中的 SYS 租户和 Oracle 租户以及 MySQL 租户。
适用版本
OceanBase 数据库 V3.2.3(oceanbase-3.2.3.0-20220418212020)版本。
解决方法及规避方式
在 SQL 的窗口函数子查询上添加 Hint:/*+no_rewrite*/。