神通数据库(OSCAR)7.0 建索引用标准 CREATE INDEX 即可,语法和 Oracle/PostgreSQL 风格接近。下面按常见场景给可直接执行的写法。
一、最基础:给单字段加普通索引
假设表名叫 T_XXX,字段叫 aaa:
CREATE INDEX idx_t_xxx_aaa ON T_XXX (aaa);
索引名建议按 idx_表名_字段名 规范起,方便后期维护。
如果表在某个模式(schema)下,比如 sch1.aaa 字段在表 t1:
CREATE INDEX sch1.idx_t1_aaa ON sch1.t1 (aaa);
神通支持“模式名.对象名”前缀,连接后当前 search_path 不对时就写全 。
二、唯一索引
如果 aaa 业务上不允许重复值:
CREATE UNIQUE INDEX idx_t_xxx_aaa ON T_XXX (aaa);
注意:建唯一索引前先确认表里
aaa没有重复值,否则会报唯一约束错误。可先查:
SELECT aaa, COUNT(*) FROM T_XXX GROUP BY aaa HAVING COUNT(*) > 1;
三、联合索引(多字段)
如果查询经常是 WHERE aaa=? AND bbb=?:
CREATE INDEX idx_t_xxx_aaa_bbb ON T_XXX (aaa, bbb);
把过滤性高、最常用于 WHERE 的字段放前面。
四、避免重复建索引
神通 7.0 不一定像 MySQL 8 那样支持 CREATE INDEX IF NOT EXISTS(以你手头官方手册为准)。稳妥做法先查再建:
-- 查某表已有索引(神通系统视图思路,实际字段名以7.0手册为准)SELECT * FROM v_sys_indexes WHERE table_name = 'T_XXX';
确认没有再执行 CREATE INDEX。也可以通过 ShenTong Manager 图形界面看表→索引。
五、删除 / 重建
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. 查看某张表上所有的索引
-- 方式A:使用 user_indexes(Oracle兼容模式常用)SELECT index_name, table_name, uniquenessFROM user_indexesWHERE table_name = 'T_XXX'; -- 表名注意大小写,神通默认常为大写-- 方式B:使用 v_sys_indexes(系统级视图,上一轮提到过)SELECT * FROM v_sys_indexes WHERE table_name = 'T_XXX';
📌 注意:如果你的表名或字段名在创建时用了双引号(如
"aaa"),那么查询条件里也要保持大小写一致,或者用UPPER()函数包一下。
2. 查看索引具体建在了哪些字段上
SELECT index_name, column_name, column_positionFROM user_ind_columnsWHERE table_name = 'T_XXX'ORDER BY index_name, column_position;
如果你能看到 aaa 字段和对应的索引名(比如 idx_t_xxx_aaa),就说明索引已经成功创建了。
方法二:通过执行计划验证(确认索引“真的能用”)
索引建成功 ≠ 查询一定会走索引。你可以通过 EXPLAIN 或 EXPLAIN ANALYZE 看执行计划,确认优化器是否选择了你刚建的索引:
EXPLAIN SELECT * FROM T_XXX WHERE aaa = '某个值';
看输出结果里有没有类似这样的信息:
Index Scan using idx_t_xxx_aaa(走了索引扫描)- 或者
Bitmap Index Scan(位图索引扫描)
如果看到的是 Seq Scan / Full Table Scan(全表扫描),说明虽然索引存在,但可能因为以下原因没被使用:
- 表里数据量太小,优化器认为全表扫更快;
- 统计信息没更新(可尝试
ANALYZE TABLE T_XXX;); - 查询条件对
aaa字段做了函数操作或类型隐式转换(如WHERE aaa + 1 = 5或字符/数字混用)。
方法三:用 ShenTong Manager 图形化工具查看
如果你用的是神通自带的 ShenTong Manager(或类似图形客户端):
- 连接数据库,找到对应的 Schema(模式);
- 展开 表(Tables) → 找到你的表
T_XXX; - 展开表的 索引(Indexes) 节点;
- 如果能看到你刚创建的索引名,且状态正常(没有红色报错图标),就是添加成功了。
方法四:通过“重复创建报错”反证(不推荐生产环境)
你可以再执行一次同样的 CREATE INDEX 语句:
CREATE INDEX idx_t_xxx_aaa ON T_XXX (aaa);
- 如果返回类似 “索引已存在” 或 “名称已被使用” 的错误,说明之前已经建成功了。
- 如果返回成功,说明之前没建上(或者你换了索引名)。
⚠️ 生产环境不建议这么干,尤其是大表,重复执行
CREATE INDEX可能会短暂锁表或消耗资源。
补充:如果索引建完发现“没生效”怎么办?
- 更新统计信息(神通优化器依赖统计信息做选择):
更新完再跑ANALYZE TABLE T_XXX;
EXPLAIN看看是否走索引。 - 确认字段类型匹配:比如
aaa是VARCHAR,查询时别传NUMBER类型,避免隐式转换导致索引失效。 - 检查索引状态:通过系统视图看索引是否
VALID(有效),如果失效需要REBUILD(神通语法参考官方手册,通常是删了重建)。
