oracle全文索引(ctxsys.context)不支持local分区,必须建在非分区表或整个分区表上,无法与表分区对齐,也不支持分区裁剪;正确语法不含local/global子句。
全文索引不能建在local分区索引上
oracle 的全文索引(ctxsys.context 类型)**不支持 local 分区**,也不能附加到分区表的局部索引结构上。它本质是逻辑索引,底层由多个系统管理的基表和索引段组成,与表分区无映射关系。试图对分区表字段执行 create index ... on table(col) indextype is ctxsys.context local 会直接报错:ora-29855: error occurred in the execution of odciindexcreate routine 或类似提示。
常见错误现象:
- 误以为“LOCAL”可加在全文索引语句末尾,实际语法不被接受
- 在已分区表上直接建
ctxsys.context索引后,发现无法利用分区裁剪(partition pruning),查询仍扫描全部分区 - 全文索引重建或同步(
CTX_DDL.SYNC_INDEX)时耗时陡增,因底层需遍历全表数据而非单个分区
全文索引必须建在非分区表或整个分区表上
全文索引只能建在单个表对象上,且该表无需(也不支持)按索引维度分区。即使底层表是分区表,全文索引仍是全局逻辑结构,覆盖所有分区数据。
正确做法:
- 确认目标表已存在且有足够权限:如
GRANT EXECUTE ON CTXSYS.CTX_DDL TO your_user - 使用标准全文索引创建语法,不带
LOCAL或GLOBAL PARTITION BY ...子句:CREATE INDEX idx_doc_content_ft ON documents(content) INDEXTYPE IS ctxsys.context - 若表极大(如 TB 级),建议先禁用并行、关闭日志:
CREATE INDEX ... NOLOGGING PARALLEL 1,建完再ALTER INDEX ... NOPARALLEL - 全文索引不响应 DML 实时更新,必须显式调用
CTX_DDL.SYNC_INDEX才能反映新数据
LOCAL本地化策略只适用于B树/位图索引
所谓“LOCAL本地化策略”,在 Oracle 分区上下文中专指索引分区方式与表分区严格对齐——即每个索引分区只服务一个表分区,且随表分区生命周期自动维护。这仅适用于 B-tree 和 BITMAP 索引类型。
关键限制点:
-
HASH索引不支持分区(ORA-01408: such column list already indexed) -
CTXSYS.CONTEXT索引不支持任何分区语法(LOCAL/GLOBAL/PARTITION BY) - 位图索引强制要求 LOCAL(
ORA-25954: missing primary key or unique constraint on dimension tables若尝试 GLOBAL) - 唯一约束若依赖 LOCAL 索引,必须包含分区键列,否则建索引失败:
ORA-14039: partitioning columns must form a subset of key columns
想“局部化”全文检索?得换思路
如果业务真需要按分区做文本检索隔离(例如只查 2025Q1 分区内的文档),全文索引本身做不到,但可通过组合手段逼近效果:
- 在查询中显式加上分区键谓词,配合普通 B-tree 索引加速分区裁剪,再套全文过滤:
SELECT * FROM docs PARTITION (p_2025_q1) WHERE CONTAINS(content, 'oracle') > 0 - 为高频查询分区单独建非分区表(如
docs_2025_q1),在其上建独立全文索引,避免跨分区干扰 - 用物化视图按分区预聚合 + 全文索引,但需权衡刷新延迟与存储开销
- 真正的大规模场景,应评估迁移到专用搜索引擎(如 Elasticsearch),它原生支持分片+倒排索引+分布式查询
全文索引的“全局性”不是缺陷,而是设计使然;强行套用 LOCAL 概念,反而会绕进语法报错、维护失控、性能不可控的死胡同。











