神通数据库(OSCAR)7.0 建索引用标准 CREATE INDEX 即可,语法和 Oracle/PostgreSQL 风格接近。下面按常见场景给可直接执行的写法。

一、最基础:给单字段加普通索引

假设表名叫 T_XXX,字段叫 aaa:

  1. CREATE INDEX idx_t_xxx_aaa ON T_XXX (aaa);

索引名建议按 idx_表名_字段名 规范起,方便后期维护。

如果表在某个模式(schema)下,比如 sch1.aaa 字段在表 t1:

  1. CREATE INDEX sch1.idx_t1_aaa ON sch1.t1 (aaa);

神通支持“模式名.对象名”前缀,连接后当前 search_path 不对时就写全 。

二、唯一索引

如果 aaa 业务上不允许重复值:

  1. CREATE UNIQUE INDEX idx_t_xxx_aaa ON T_XXX (aaa);

注意:建唯一索引前先确认表里 aaa 没有重复值,否则会报唯一约束错误。可先查:

  1. SELECT aaa, COUNT(*) FROM T_XXX GROUP BY aaa HAVING COUNT(*) > 1;

三、联合索引(多字段)

如果查询经常是 WHERE aaa=? AND bbb=?:

  1. CREATE INDEX idx_t_xxx_aaa_bbb ON T_XXX (aaa, bbb);

把过滤性高、最常用于 WHERE 的字段放前面。

四、避免重复建索引

神通 7.0 不一定像 MySQL 8 那样支持 CREATE INDEX IF NOT EXISTS(以你手头官方手册为准)。稳妥做法先查再建:

  1. -- 查某表已有索引(神通系统视图思路,实际字段名以7.0手册为准)
  2. SELECT * FROM v_sys_indexes WHERE table_name = 'T_XXX';

确认没有再执行 CREATE INDEX。也可以通过 ShenTong Manager 图形界面看表→索引。

五、删除 / 重建

  1. DROP INDEX idx_t_xxx_aaa;

如果带模式:DROP INDEX sch1.idx_t1_aaa;

改索引一般是先删后建;改字段类型导致索引失效也同理重建。

六、大表 / 生产环境注意

  • 低峰执行:大表建索引会扫全表、写索引结构,耗时和锁都会影响业务。
  • 先清长事务:建索引前确认没有未提交事务、没有对该表的长时间查询,避免元数据锁排队。
  • 排序内存:神通建索引会用到排序内存(SORT_MEM 相关参数),大表可适当评估调大再建,完事再调回。
  • 先看执行计划:建完用 EXPLAIN / EXPLAIN ANALYZE(神通支持 EXPLAIN 类分析)确认查询走了新索引而不是全表扫。
  • CLOB/BLOB 超大文本字段不建议直接建普通索引;如需加速模糊检索要另外看全文/函数索引方案。

在神通数据库(OSCAR)7.0 中,验证索引是否添加成功,通常有以下几种方法,从“确认存在”到“确认生效”递进:


验证索引是否成功

方法一:查询系统视图(最准确、最推荐)

神通数据库提供了数据字典/系统视图来查看索引信息。你可以在 isql 命令行或者管理工具里执行以下 SQL:

1. 查看某张表上所有的索引

  1. -- 方式A:使用 user_indexes(Oracle兼容模式常用)
  2. SELECT index_name, table_name, uniqueness
  3. FROM user_indexes
  4. WHERE table_name = 'T_XXX'; -- 表名注意大小写,神通默认常为大写
  5. -- 方式B:使用 v_sys_indexes(系统级视图,上一轮提到过)
  6. SELECT * FROM v_sys_indexes WHERE table_name = 'T_XXX';

📌 注意:如果你的表名或字段名在创建时用了双引号(如 "aaa"),那么查询条件里也要保持大小写一致,或者用 UPPER() 函数包一下。

2. 查看索引具体建在了哪些字段上

  1. SELECT index_name, column_name, column_position
  2. FROM user_ind_columns
  3. WHERE table_name = 'T_XXX'
  4. ORDER BY index_name, column_position;

如果你能看到 aaa 字段和对应的索引名(比如 idx_t_xxx_aaa),就说明索引已经成功创建了。


方法二:通过执行计划验证(确认索引“真的能用”)

索引建成功 ≠ 查询一定会走索引。你可以通过 EXPLAIN 或 EXPLAIN ANALYZE 看执行计划,确认优化器是否选择了你刚建的索引:

  1. EXPLAIN SELECT * FROM T_XXX WHERE aaa = '某个值';

看输出结果里有没有类似这样的信息:

  • Index Scan using idx_t_xxx_aaa (走了索引扫描)
  • 或者 Bitmap Index Scan (位图索引扫描)

如果看到的是 Seq Scan / Full Table Scan(全表扫描),说明虽然索引存在,但可能因为以下原因没被使用:

  1. 表里数据量太小,优化器认为全表扫更快;
  2. 统计信息没更新(可尝试 ANALYZE TABLE T_XXX;);
  3. 查询条件对 aaa 字段做了函数操作或类型隐式转换(如 WHERE aaa + 1 = 5 或字符/数字混用)。

方法三:用 ShenTong Manager 图形化工具查看

如果你用的是神通自带的 ShenTong Manager(或类似图形客户端):

  1. 连接数据库,找到对应的 Schema(模式);
  2. 展开 表(Tables) → 找到你的表 T_XXX;
  3. 展开表的 索引(Indexes) 节点;
  4. 如果能看到你刚创建的索引名,且状态正常(没有红色报错图标),就是添加成功了。

方法四:通过“重复创建报错”反证(不推荐生产环境)

你可以再执行一次同样的 CREATE INDEX 语句:

  1. CREATE INDEX idx_t_xxx_aaa ON T_XXX (aaa);
  • 如果返回类似 “索引已存在” 或 “名称已被使用” 的错误,说明之前已经建成功了。
  • 如果返回成功,说明之前没建上(或者你换了索引名)。

⚠️ 生产环境不建议这么干,尤其是大表,重复执行 CREATE INDEX 可能会短暂锁表或消耗资源。


补充:如果索引建完发现“没生效”怎么办?

  1. 更新统计信息(神通优化器依赖统计信息做选择):
    1. ANALYZE TABLE T_XXX;
    更新完再跑 EXPLAIN 看看是否走索引。
  2. 确认字段类型匹配:比如 aaa 是 VARCHAR,查询时别传 NUMBER 类型,避免隐式转换导致索引失效。
  3. 检查索引状态:通过系统视图看索引是否 VALID(有效),如果失效需要 REBUILD(神通语法参考官方手册,通常是删了重建)。