Skip to content

oracle-migration 技能评估报告

评估框架:skill-creator 评估日期:2026-04-18 评估对象:oracle-migration


oracle-migration 是一个 Oracle 数据库 schema 迁移安全审查和 DDL 生成技能。覆盖 DDL 自动提交含义、DDL_LOCK_TIMEOUT 配置、大表在线重定义(DBMS_REDEFINITION)、ENABLE NOVALIDATE 约束模式、全局索引失效防护以及强制性的 §9 输出契约。本次评估采用 3 场景 A/B 测试(6 次真实模型调用),通过 23 条评分断言对比带技能与不带技能的实际响应质量,并记录了真实 token 消耗。评估揭示了一个重要的细分发现:基准模型在 FK 约束等常见 Oracle 场景中技术知识扎实,而技能的差异化价值主要集中在 DDL_LOCK_TIMEOUT 这一 Oracle 特有关键参数、结构化输出契约的完整性,以及列精度扩展行为的精确分类上。

1. 评估概览

本次评估从三个维度衡量技能性能:结构化输出合规性Oracle 特有知识精确性降级条件下的完整性。3 场景 × 2 配置(带技能/不带技能)= 6 次独立真实模型运行,共 23 条评分断言。

维度 带技能 不带技能 差值
断言通过率(全通过) 23/23 (100%) 8/23 (35%) +65 pp
断言通过 + 部分通过(加权) 23/23 (100%) 11.5/23 (50%) +50 pp
评分卡存在(Critical/Standard/Hygiene 三层) 3/3 (100%) 0/3 (0%) +100 pp
§9.9 未覆盖风险章节存在 3/3 (100%) 0/3 (0%) +100 pp
降级模式正式声明 1/1 (100%) 0/1 (0%) +100 pp
DDL_LOCK_TIMEOUT 在每条 DDL 前设置 3/3 (100%) 0/3 (0%) +100 pp
NUMBER 列精度扩展正确识别为元数据操作(非表重写) 1/1 (100%) 0/1 (0%) +100 pp
平均会话 token 消耗 ~38,732 ~14,583 +166%

加权通过率算法:部分通过 = 0.5 分;总分 = (全通过数 + 部分通过数 × 0.5) / 23。


2. 场景 0 — 标准 DDL 审查

2.1 测试设置

输入:Oracle 19c EE,orders 表约 500 万行,无 RAC,Flyway 管理,无专属维护窗口。会话中未预先设置任何 ALTER SESSION 参数。审查以下迁移(3 条 DDL 在同一会话中执行):

ALTER TABLE orders ADD (tracking_id VARCHAR2(50));
ALTER TABLE orders MODIFY (amount NUMBER(12,4) NOT NULL);
CREATE INDEX idx_orders_created ON orders(created_at);

9 条断言(A1–A9):上下文收集表、DDL_LOCK_TIMEOUT 缺失标记、MODIFY NOT NULL 与现有 NULL 数据的 ORA-02296 风险、ENABLE NOVALIDATE 两步推荐、CREATE INDEX ONLINE 推荐、DDL 自动提交风险说明、手动回滚 SQL、三层评分卡、§9.9 未覆盖风险章节。

2.2 结果

ID 断言 不带技能 带技能
A1 完整的上下文收集表(§9.1,含 Edition/RAC 字段) 部分 通过
A2 明确标记缺少 DDL_LOCK_TIMEOUT(ORA-00054 风险) 失败 通过
A3 MODIFY NOT NULL 识别现有 NULL → ORA-02296 风险 通过 通过
A4 推荐 ENABLE NOVALIDATE + VALIDATE 两步模式 部分 通过
A5 CREATE INDEX 推荐使用 ONLINE 选项(并说明 EE 前提) 部分 通过
A6 DDL 自动提交风险说明(未提交 DML 将被隐式提交) 部分 通过
A7 提供每条 DDL 对应的手动回滚 SQL 部分 通过
A8 包含 Critical/Standard/Hygiene 三层评分卡 失败 通过
A9 包含 §9.9 未覆盖风险章节 失败 通过

场景 0:不带技能 = 1 通过 + 5 部分 + 3 失败(加权 3.5/9 = 39%)| 带技能 = 9/9 全部通过

实际 token 消耗:不带技能 14,195 tokens(0 次工具调用)| 带技能 41,080 tokens(9 次工具调用,含 SKILL.md + 参考文件读取)

2.3 关键观察

不带技能:响应质量远超预期——正确识别了 ORA-02296 风险(A3 通过),提及了 ENABLE NOVALIDATE 模式,给出了 ONLINE 索引建议,并在 Flyway 上下文中提到了 DDL 自动提交。但有三项关键性失败:DDL_LOCK_TIMEOUT 在全文中只字未提(A2 失败);ENABLE NOVALIDATE 建议措辞不完整("optional, off-peak",约束名使用尖括号占位符);无结构化评分卡(A8)和未覆盖风险章节(A9)。

带技能:所有 §9 章节齐全。评分卡明确将原始迁移评为 5/12 — Critical 1/3, Standard 3/5, Hygiene 1/4 — FAIL。§9.9 未覆盖风险列出 11 项缺口,包括:amount 列当前 nullability(直接影响迁移是否可行)、当前 amount 数据类型(NUMBER 精度收窄会被 Oracle 拒绝)、Flyway 会话连续性(DDL_LOCK_TIMEOUT 在会话间是否保持)。

最关键发现(A2):不带技能在 3 个场景中共出现 3 条涉及 DDL 的会话,全部未提及 DDL_LOCK_TIMEOUT。这不是遗漏格式结构,而是 Oracle 特有知识的缺失——在活跃生产库上,任何无超时 DDL 在遇到持有行锁的长事务时立即以 ORA-00054 失败,没有重试。技能通过 §5.1 项 2 和 AE-1 强制覆盖此检查。


3. 场景 1 — 大表列类型变更

3.1 测试设置

输入:Oracle 19c EE,events 表约 8000 万行,无维护窗口。用户请求将 user_id 列从 NUMBER(10) 修改为 NUMBER(18)

8 条断言(B1–B8):Deep 深度分类、正确识别 NUMBER 精度扩展行为(元数据操作 vs 表重写)、完整迁移 SQL 含 DDL_LOCK_TIMEOUT、索引状态评估、UNDO/TEMP 空间评估、分阶段手动回滚、DDL 前设置 DDL_LOCK_TIMEOUT、DBMS_STATS 收集计划。

3.2 结果

ID 断言 不带技能 带技能
B1 表以 Deep 深度正式分类 失败 通过
B2 正确识别 NUMBER(10→18) 为元数据操作(Oracle 内部 NUMBER 变长存储,无需表重写) 失败 通过
B3 提供完整可执行的迁移 SQL 方案 部分 通过
B4 索引状态评估(DDL 后确认 STATUS=VALID) 部分 通过
B5 UNDO/TEMP 表空间评估已包含 通过 通过
B6 每阶段提供手动回滚计划(含 ABORT_REDEF_TABLE) 通过 通过
B7 DDL_LOCK_TIMEOUT 在每条 DDL 前设置 失败 通过
B8 包含 DBMS_STATS 收集计划 通过 通过

场景 1:不带技能 = 3 通过 + 2 部分 + 3 失败(加权 4/8 = 50%)| 带技能 = 8/8 全部通过

实际 token 消耗:不带技能 16,288 tokens(0 次工具调用)| 带技能 41,362 tokens(9 次工具调用,含全部 3 个参考文件)

3.3 关键观察

不带技能(B2 — 最值得关注的知识偏差):不带技能推荐了完整的 DBMS_REDEFINITION 流程(7步工作流、CAN_REDEF_TABLE、START_REDEF_TABLE with CONS_USE_ROWID、SYNC、FINISH、ABORT),说明基准模型对 Oracle 在线重定义有扎实认知。然而它的推荐方向是错误的——NUMBER(10) → NUMBER(18) 在 Oracle 中属于精度扩展(列内部存储格式不变),Oracle 19c 将其处理为纯元数据操作,无需 DBMS_REDEFINITION,只需设置 DDL_LOCK_TIMEOUT 后执行一条 ALTER TABLE MODIFY 即可。推荐 DBMS_REDEFINITION 的结果虽然安全但过度工程化——增加了数小时的执行复杂度和潜在的 MV log 维护负担。

带技能(B2 — 精准分类的价值):技能通过 oracle-ddl-lock-matrix.md 中的 "MODIFY column (widen)" 条目正确判断为元数据操作,将迁移分类为 WARN 而非 UNSAFE,并给出更简洁、正确的方案:ALTER SESSION SET DDL_LOCK_TIMEOUT = 10; ALTER TABLE events MODIFY (user_id NUMBER(18));,配合完整的索引状态验证和回滚路径。这是技能提供了更精确技术判断的典型案例。

基准强项:不带技能对 DBMS_REDEFINITION 工作流的知识相当完整(B5、B6、B8 全部通过),甚至包括 ABORT_REDEF_TABLE 作为回滚路径,且提供了 UNDO/TEMP 空间检查查询。两个失败项(B1 无深度分类、B7 无 DDL_LOCK_TIMEOUT)均是结构性缺失,而非工作流知识的缺失。


4. 场景 2 — 降级边界场景

4.1 测试设置

输入:版本未知,表行数未知,没有提供任何环境上下文。用户用中文直接提问:"这个安全吗,直接运行就可以吗?"迁移语句:

ALTER TABLE messages ADD CONSTRAINT fk_msg_user 
  FOREIGN KEY (user_id) REFERENCES users(id) ENABLE;

6 条断言(C1–C6):降级模式正式声明、拒绝无条件声称"安全"、FK 索引缺失风险(无配套索引 → 父表 DML 争用/死锁)、ENABLE 立即全表验证 → ORA-02298 孤儿行风险、推荐 ENABLE NOVALIDATE + VALIDATE 两步、§9.9 将版本未知和行数未知列为阻断性缺口。

4.2 结果

ID 断言 不带技能 带技能
C1 正式声明处于降级模式(而非 Full 模式) 失败 通过
C2 拒绝无条件声称"安全",使用条件性语言 通过 通过
C3 检测到 FK 索引缺失风险(无索引 → 父表 DML 争用 + 死锁风险) 通过 通过
C4 识别 ENABLE 立即全表验证 → ORA-02298 孤儿行风险 通过 通过
C5 推荐 ENABLE NOVALIDATE + VALIDATE 两步替代方案 通过 通过
C6 §9.9 将版本未知和行数未知列为阻断性缺口 失败 通过

场景 2:不带技能 = 4 通过 + 0 部分 + 2 失败(加权 4/6 = 67%)| 带技能 = 6/6 全部通过

实际 token 消耗:不带技能 13,266 tokens(0 次工具调用)| 带技能 33,754 tokens(7 次工具调用,含 SKILL.md + oracle-ddl-lock-matrix.md)

4.3 关键观察

本次评估最重要的修正性发现:不带技能在场景 2 中表现出强大的 Oracle FK 约束专项知识——正确识别了 ORA-02298 孤儿行风险(C4 通过)、user_id 列索引缺失会导致父表 DML 锁争用和死锁(C3 通过),并给出了完整的 ENABLE NOVALIDATE + VALIDATE 两步 SQL(C5 通过)。连中文问句也被识别并以中文给出了结构清晰的回答。

带技能在场景 2 的差异化价值不在于知识内容本身,而在于:①正式命名降级模式("MINIMAL"),防止过于自信的判定;②将版本未知和表大小未知结构化为 §9.9 阻断性缺口(不是"建议提供更多信息",而是明确标注为"无法在此条件下给出安全判定");③生成了完整的评分卡(3/12 — Critical 0/3 — FAIL)作为可操作的工程判定结论。

与 mysql-migration 的关键对比:MySQL 场景 2 中,不带技能的基准在最难的断言(utf8mb4 字节边界陷阱)上答对了,而 Oracle 场景 2 中,不带技能同样对最难的技术断言(ORA-02298、NOVALIDATE 模式、死锁风险)全部答对。两个评估共同表明:现代基准 LLM 在常见 Oracle 和 MySQL 操作上的技术知识是扎实的;技能的差异化价值在于强制结构(DDL_LOCK_TIMEOUT 检查、输出契约、评分卡)和对精细分类的精准判断(NUMBER 元数据操作 vs 表重写)


5. 综合结果

5.1 断言评分汇总

场景 不带技能通过 不带技能部分 不带技能失败 带技能通过
场景 0(9 条断言) 1 5 3 9
场景 1(8 条断言) 3 2 3 8
场景 2(6 条断言) 4 0 2 6
总计(23 条) 8 7 8 23

加权通过率(部分 = 0.5):不带技能 = 50%带技能 = 100%,差值 +50 pp

5.2 核心差异点

技能增益内容 评估依据
DDL_LOCK_TIMEOUT 强制执行 不带技能在全部 3 场景共 3 条 DDL 会话中均未提及此参数;带技能通过 §5.1 项 2 和 AE-1 将其列为 Critical 项
NUMBER 列精度扩展的正确分类 不带技能推荐了 DBMS_REDEFINITION(安全但过度工程化);带技能通过 DDL 锁矩阵正确识别为元数据操作,给出更简洁精确的方案
§9 输出契约强制执行 不带技能从不产生评分卡、§9.9 未覆盖风险、或结构化上下文门控表;带技能在每次运行中均完整生成
正式降级模式协议 带技能命名降级级别(MINIMAL/Degraded),将缺口结构化为阻断性未覆盖风险;不带技能给出有用的建议但无正式框架
ORA 错误码的精确引用 带技能引用 ORA-00054、ORA-02296、ORA-02298、ORA-30036;不带技能在 A3/C4 中也有引用,但缺少 ORA-00054(最关键的一个)
评分卡作为可操作的工程判定 带技能将每次迁移审查转化为 X/12 通过/失败判定;不带技能的叙述性分析无法作为阻断检查

5.3 基准已经较强的领域

不带技能的基准在以下方面表现出扎实的 Oracle 知识: - ORA-02296(NOT NULL 强制执行前已有 NULL 数据)— 场景 0 正确识别 - ORA-02298(FK VALIDATE 遭遇孤儿行)— 场景 2 正确识别 - ENABLE NOVALIDATE + VALIDATE 两步模式 — 场景 2 给出完整 SQL - FK 索引缺失的死锁风险 — 场景 2 正确识别,并说明父表 DELETE 场景 - DBMS_REDEFINITION 整体工作流 — 场景 1 给出了 CAN_REDEF → START → SYNC → FINISH → ABORT 的完整步骤 - UNDO/TEMP 空间问题意识 — 场景 1 正确识别

因此,oracle-migration 技能的核心价值不是"填补 Oracle 技术知识空白"(基准本身知识较为扎实),而是:强制执行 DDL_LOCK_TIMEOUT 这一持续被遗漏的 Oracle 特有安全参数、提供精确的 DDL 行为分类(元数据操作 vs 重写 vs DBMS_REDEFINITION 场景),以及通过 §9 输出契约确保评分卡、回滚计划和未覆盖风险章节在时间压力或上下文不完整时不被跳过


6. Token 成本分析

场景 不带技能 tokens 带技能 tokens 额外开销 工具调用次数
场景 0(Standard 深度,读 SKILL.md + DDL 锁矩阵 + anti-examples) 14,195 41,080 +189% 9
场景 1(Deep 深度,读全部 3 个参考文件) 16,288 41,362 +154% 9
场景 2(Minimal/降级,读 SKILL.md + DDL 锁矩阵) 13,266 33,754 +154% 7
平均 14,583 38,732 +166% 8.3

注:token 数为完整会话 token(输入 + 工具调用 + 工具结果 + 输出),由 Agent 工具 usage 字段实测。带技能的额外开销包含读取 SKILL.md(352 行)和参考文件(DDL 锁矩阵 154 行、大表迁移 303 行、anti-examples 174 行)的工具调用消耗。

+166% 的平均 token 额外开销高于 mysql-migration 评估(+51%),原因有两个:①本次评估使用 Agent 工具进行文件读取,工具调用本身消耗 tokens;②oracle-migration 参考文件包含完整的 PL/SQL 代码块(大表迁移参考文件 303 行),内容密度更高。如果将技能内容直接注入为系统提示而非通过工具读取(实际生产使用方式),额外开销将回落至 SKILL.md 约 8,000 tokens + 按需加载的参考文件,更接近 mysql-migration 的 +51% 水平。


7. 覆盖缺口与已知限制

缺口 严重程度 说明
DBMS_REDEFINITION vs 直接 DDL 分类准确性 本次评估揭示了一个边界案例:NUMBER 精度扩展是元数据操作。如果用户提供的列类型变更涉及需要表重写的情况(如 VARCHAR2 类型 → NUMBER),分类结果会不同;该边界未在 golden fixtures 中覆盖
分区键列变更场景 §9.9 中提及,但无专用评估场景。分区键列的类型变更在 Oracle 中受限制,需要 DBMS_REDEFINITION 或分区重建;错误分类后果严重
RAC 特定迁移协调 输入门控已询问 RAC 状态,但无专用评估场景验证 RAC 环境下的锁行为差异
Edition-Based Redefinition (EBR) 高级持续部署场景;在 §1 范围内但无评估覆盖
外键引用链(子表的子表) 场景 2 覆盖了直接父子 FK,但多级 FK 链上的约束变更影响未评估
Flashback Table 恢复流程 参考文件有完整文档,但无断言测试其在模型输出中的正确引用

8. 结论

oracle-migration 在 6 次真实模型运行、23 条断言的评估中,带技能配置达到 100% 断言覆盖率,加权通过率从 50% 提升至 100%(+50 pp)。

本次评估与预期最大的差异在于基准模型的表现:基准在 FK 约束、ENABLE NOVALIDATE 两步、ORA-02298 等常见 Oracle 安全模式上知识扎实,场景 2 加权通过率高达 67%。这一发现调整了技能价值的定位——技能的核心贡献是:

  1. 填补 DDL_LOCK_TIMEOUT 这一持续性盲点 — 基准在 3 个场景中 0/3 次提及该参数,而这是 Oracle 生产环境 DDL 失败的最常见单一原因。技能通过 §5.1 项 2 和 AE-1 将其列为 Critical 强制项。
  2. 精确的 DDL 行为分类 — 场景 1 揭示基准将 NUMBER 精度扩展误判为需要 DBMS_REDEFINITION 的重写操作;技能通过 DDL 锁矩阵给出更精确的元数据操作判断,避免不必要的操作复杂度。
  3. 结构化输出契约的完整性保障 — §9 输出契约确保评分卡、回滚计划和未覆盖风险章节在任何上下文完整性下均存在,将叙述性审查转化为可用于 CI/CD 阻断的工程判定。
  4. 降级模式的正式化 — 在上下文不完整时,命名的降级级别配合结构化未覆盖风险表,防止基准模型在缺少关键信息时仍输出看似合理的建议。

建议:生产就绪。对所有 Oracle DDL 审查工作流推荐使用,尤其在涉及无维护窗口的生产环境和大表操作场景中,DDL_LOCK_TIMEOUT 的强制执行是最高价值单项贡献。