再上一篇:11.3位图索引
上一篇:11.4基于函数的索引
主页
下一篇:11.6关于索引的常见问题和神话
再下一篇:11.7小结
文章列表

11.5应用域索引

Oracle 9i 10g编程艺术:深入数据库体系结构

应用域索引(application domain index)即 Oracle 所谓的可扩展索引(extensible indexing)。 利用应用域索引,你可以创建自己的索引结构,使之像Oracle提供的索引一样工作。有人使用你的索引类 型发出一个CREATE INDEX 语句时,Oracle会运行你的代码来生成这个索引。如果有人分析索引来计算统 计信息,Oracle会执行你的代码来生成统计信息(采用你要求的存储格式)。Oracle解析查询并开发查询 计划时,如果查询计划中可能使用你的索引,Oracle会问你:这个函数的计算不同的计划时会有怎样的开 销。简单地说,利用应用域索引,你能实现数据库中原本没有的一个新的索引类型。例如,如果你开发一 个软件来分析数据库中存储的图像,而且生成了关于图像的信息(如图像中的颜色),就可以创建你自己的 图像(image)索引。向数据库中增加图象时,会调用你的代码,从图像中抽取颜色,并将其存储在某个地 方(你想存储图像索引的任何地方)。查询时,用户请求所有“蓝色图像”时,Oracle就会在合适的时候 从索引提供答案。

对此最好的例子是Oracle自己的文本索引(text index)。这个索引用于对大量的文本项提供关键字 搜索。可以如下创建一个简单的文本索引:
ops$tkyte@ORA10G> create index myindex on mytable(docs)
2 indextype is ctxsys.context
3 /
Index created.

这个索引的创建者向SQL语言中引入了一些文本运算符,接下来使用这些文本运算符:
select * from mytable where contains( docs, 'some words' ) > 0;

它甚至能对如下的命令做出响应:
ops$tkyte@ORA10GR1> begin
2 dbms_stats.gather_index_stats( user, 'MYINDEX' );
3 end;
4 /
PL/SQL procedure successfully completed.
它会与优化器合作,在运行时确定使用文本索引(而不是其他某个索引或前面扫描)的相对开销。有 意思的是,任何人(包括你和我)都可以开发这样一个索引。文本索引的实现无需你了解“内部核心知识”。 这是使用专用的API完成的,这些API有文档说明而且已经公开提供。Oracle数据库内核并不关心文本索 引如果存储(对于创建的每个索引,API会把它存储在多个物理数据库表中)。Oracle也不知道插入新行时 会做怎样的处理。Oracle文本实际上是建立在数据库之上的一个应用,但采用了一种完全集成的方式。对 于你和我来说,这看上去就像是如何其他Oracle数据库内核函数一样,但事实上它并不是内核函数。
我个人认为,没有必要去构建一个标新立异的索引结构类型,在我看来,这种特定的特性大多由第三 方解决方案提供者使用(他们有一些创新性的索引技术)。
我认为,应用域索引最有意思的一点是:利用应用域索引,这就允许其他人提供新的索引技术,而我 可以在自己的应用中使用这些技术。大多数人从来都没有用过这种特定的API来构建新的索引类型,但是 我们大多都用到过某种非内置的新索引类型。我参与的几乎每一个应用都有一些与之相关的文本(text)、 待处理的XML或者要存储和分类的图像(image)。这些功能通过一个 interMedia功能集(利用了应用域索 引特性来实现)就能提供。随着时间的推移,可用的索引类型越来越多。我们将在下一章更深入地分析文 本索引。