问题现象
对包含全文索引或向量索引的表执行 DML 操作时,如果启用了 index merge 功能,可能会遇到错误码 4007。具体表现为 SQL 更新语句执行失败,并返回错误信息:complex query with dml on fulltext index / vector index is not supported。
报错 SQL 示例:
-- 开启 index merge 功能
alter system set _enable_index_merge = true;
-- 创建包含全文索引的表
create table t2(
id bigint primary key,
c1 int,
c2 int,
name varchar(200),
fulltext key ft_name(name) with parser beng,
key idx_c1(c1)
);
-- 插入测试数据
insert into t2 values (1, 1, 2, 'hello'), (2, 2, 1, 'hi');
-- 执行更新语句,使用 index merge 提示
update /*+ index_merge(t2 idx_c1 idx_c2) */ t2
set name = 'world'
where c1 = 1 or c2 = 2;
执行上述更新语句时,预期会报错:complex query with dml on fulltext index is not supported。
报错日志:
在 observer 日志中搜索相关错误信息,可以看到如下关键日志行:
[2025-12-15 21:46:47.771744] WDIAG [SQL.OPT] check_das_need_scan_with_domain_id (ob_log_plan.cpp:15852) [78110][T1002_L0_G0][T1002][YB420A6801E8-000645C4F6C5A661-0-0] [lt=0][errcode=-4007] complex query with dml on fulltext index / vector index not supported(ret=-4007)
[2025-12-15 21:46:47.771762] WDIAG check_das_need_scan_with_domain_id (ob_log_plan.cpp:15853) [78110][T1002_L0_G0][T1002][YB420A6801E8-000645C4F6C5A661-0-0] [lt=16][errcode=-4007] complex query with dml on fulltext index is not supported
关键信息
触发此问题的关键条件组合如下:
- 配置项
_enable_index_merge被设置为true,允许优化器选择 index merge 路径。 - 目标表包含 FULLTEXT、向量或多值索引。
- DML 语句的 WHERE 条件促使优化器选择 index merge 路径(例如包含多列的 OR 条件,或使用了
/*+ index_merge(...) */提示)。 - 当以上条件同时满足时,优化器会在生成计划阶段报错:
complex query with dml on fulltext index is not supported。
问题原因
当对包含全文索引、向量索引或多值索引的表执行 DML 操作时,表的扫描操作会被标记为需要 domain_id merge = true(即表扫描需要同时访问域辅助表)。如果此时开启了配置项 _enable_index_merge,优化器可能会倾向于选择 index merge 的扫描路径。
当查询计划恰好有两个索引可供选择,并生成了 func lookup 或 index merge 路径时,就会触发优化阶段的错误检查逻辑,直接返回 OB_NOT_SUPPORTED 错误,并提示 complex query with dml on fulltext index is not supported。
关键触发流程如下:
- 开启
_enable_index_merge配置。 - 创建包含全文索引/向量索引的表并插入数据。
- 构造 UPDATE 或 DELETE 语句。
- WHERE 子句中的谓词条件(例如使用 OR 连接多列条件,或使用了
/*+ index_merge(...) */提示)促使优化器选择 index merge 路径。 - 生成执行计划时,如果扫描被判定需要
domain_id merge且访问路径为 index merge,则会命中不支持的错误逻辑。
复现用例:
-- 开启 index merge
alter system set _enable_index_merge = true;
-- 用例1:全文索引表
create table t2(
id bigint primary key,
c1 int,
c2 int,
name varchar(200),
fulltext key ft_name(name) with parser beng,
key idx_c1(c1),
key idx_c2(c2)
);
insert into t2 values (1, 1, 2, 'hello'), (2, 2, 1, 'hi');
update /*+ index_merge(t2 idx_c1 idx_c2) */ t2
set name = 'world'
where c1 = 1 or c2 = 2;
-- 预期报错:complex query with dml on fulltext index is not supported
-- 用例2:向量索引表
CREATE TABLE t3 (
id bigint PRIMARY KEY,
status tinyint,
vector VECTOR(1024),
KEY idx_status (status),
VECTOR KEY idx_vector (vector) WITH (DISTANCE=INNER_PRODUCT, TYPE=HNSW, LIB=VSAG)
);
INSERT INTO t3 VALUES (1, 1, NULL);
UPDATE t3 SET status = 2 WHERE id = 1 AND status = 1;
-- 预期报错:ERROR 1235 (0A000): complex query with dml on fulltext index is not supported
问题的风险及影响
此问题会导致对包含全文索引或向量索引表的 DML 操作(如 UPDATE、DELETE)执行失败,可能影响依赖这些操作的数据更新业务流程。
适用版本
- 开启 index merge 功能的 OceanBase 数据库 V4.4.x 版本。
- 开启 index merge 功能的 OceanBase 数据库 V4.5.1 版本。
规避方式
在修复版本发布前,可以通过临时关闭 index merge 功能来规避此问题。执行以下 SQL 命令:
alter system set _enable_index_merge = false;