本文为个人学习《Expert Oracle Database Architecture Techniques and Solutions for High Performance and Productivity(第四版本》一书过程中的笔记与理解分享,仅用于学习与交流,部分内容参考原书观点并结合>实际经验进行整理。若涉及版权问题,请联系删除或沟通处理。也请大家支持购买原版书籍。

Oracle索引的隐藏大招:让你的数据库查询飞起来

大家好!今天我们来聊聊Oracle数据库中那些不为人知的索引"黑科技"。如果你觉得数据库索引就是简单的B树结构,那可就大错特错了!Oracle提供了许多高级索引功能,能让你的查询性能提升到一个全新的水平。

什么是应用域索引?

想象一下,你可以创建自己专属的索引类型,就像Oracle官方提供的一样好用——这就是应用域索引的魅力所在。

它能做什么?

  • 自定义索引结构:比如为图片数据库创建颜色特征索引
  • 完全控制:决定索引如何存储、如何统计、如何计算成本
  • 无缝集成:使用起来和原生索引完全没有区别

最典型的例子就是Oracle的文本索引(Text Index)。你只需要简单创建:

CREATE INDEX myindex ON mytable(docs) INDEXTYPE IS ctxsys.context;

然后就能用专用语法进行搜索:

SELECT * FROM mytable WHERE CONTAINS(docs, '关键词') > 0;

神奇的是,这个文本索引完全是用Oracle公开的API开发的,并不是内核自带的功能。这意味着你我也可以开发自己的专业索引!

隐形索引:看不见的守护者

有时候,我们可能需要"隐藏"一些索引——这就是不可见索引的用武之地。

创建隐形索引:

CREATE INDEX ti ON t(x) INVISIBLE;

这时候优化器会"假装"看不到这个索引,仍然使用全表扫描。但你可以随时让它现身:

ALTER SESSION SET optimizer_use_invisible_indexes=true;

使用场景:

  1. 安全删除索引:先隐藏,观察性能,再决定是否删除
  2. 测试新索引:先隐形创建,测试无误后再启用
  3. 特殊维护:即使不可见,索引仍然维护数据完整性

需要注意的是,隐形索引仍然会占用空间和影响DML性能,不是真正的"隐身"哦。

同一列上的多重索引

从Oracle 12c开始,你可以在同一组列上创建多个不同类型的索引!

CREATE INDEX ti ON t(x);  -- B树索引
CREATE BITMAP INDEX tb ON t(x) INVISIBLE;  -- 位图索引(不可见)

这特别适合数据仓库场景:你可以同时拥有B树索引和位图索引,根据需要灵活切换。

超长字段索引技巧

Oracle 12c支持最大32K的超长字段,但直接索引会报错。怎么办呢?

解决方案1:虚拟列+索引

ALTER TABLE t ADD (xv AS (SUBSTR(x,1,10)));  -- 取前10个字符
CREATE INDEX te ON t(xv);

解决方案2:哈希索引

ALTER TABLE t ADD (xv AS (STANDARD_HASH(x)));  -- 生成哈希值
CREATE INDEX te ON t(xv);

解决方案3:函数索引

CREATE INDEX te ON t(SUBSTR(x,1,10));  -- 直接对函数结果建索引

这些方法都能巧妙避开长度限制,让超长字段也能享受索引的加速效果。

实践建议

  1. 文本搜索:直接使用Oracle Text索引,别自己造轮子
  2. 测试索引:用不可见索引先测试,效果好了再启用
  3. 超长字段:优先考虑虚拟列方案,兼容性最好
  4. 索引维护:定期检查索引使用情况,及时清理无用索引

记住,索引不是越多越好。每个索引都会增加维护成本,需要找到性能和维护开销的平衡点。

希望这些高级技巧能帮助你更好地优化数据库性能。如果你有特别的数据需求,不妨尝试开发自己的应用域索引,说不定能创造出下一个Oracle Text呢!

------------------作者介绍-----------------------

姓名:黄廷忠

现就职:Oracle中国高级服务团队

曾就职:OceanBase、云和恩墨、东方龙马等