对XML数据建立索引
对数据库来说,索引是最重要的数据库对象,对于XML Db也是这样。对于XML 数据来说,普通的索引显然无法胜任,因此ORACLE推出了针对XML的特殊索引。在ORACLE中,我们可以对XML数据建立以下类型的索引:
一 对象索引,这种索引只限于在把XML存储为相互关联的对象时使用。
Eg:CREATE INDEX ipurchaseorder_rejectedby
ON purchaseorder p (p."XMLDATA"."rejection"."rejected_by");
注:这种方法我自己没试过,只是依稀记得在OTN上看到过。
二 基于函数的索引
主要是针对extract和extractvalue两个函数建立基于函数的索引。
Eg:CREATE INDEX ipurchaseorder_rejectedby
ON purchaseorder (extractValue(OBJECT_VALUE, '/PurchaseOrder/Reject/User'));
注意这里的User必须是唯一的叶节点,也就是说它和它的所有父节点都只能出现一次。如果要针对不唯一的叶节点或者枝节点建立索引,可以使用extract函数,并使用以下技巧:
eg: CREATE INDEX ilineitem_upccode
ON purchaseorder
(extract(OBJECT_VALUE,'PurchaseOrder/LineItems/LineItem/Part/@Id').getStringVal());
注:但是这种方法是将所有的节点转化为字符串来处理,因此无法处理日期和数字类型。而且实际上XPATH会被查询重写成table.collumn.node.node.....。实际上还是用了OO的方法来模拟了XML。
三CTXXPATH索引
CTXXPATH其实是一种全文索引,功能只有一个,那就是加速existsnode函数的检索速度。具体语法如下:
CREATE INDEX [schema.]index
ON [schema.]table(XMLType column)
INDEXTYPE IS CTXSYS.ctxxpath [PARAMETERS(paramstring)];
其中:
paramstring = '[storage storage_pref] [memory memsize] [populate | nopopulate]'
eg: CREATE INDEX purchaseorder_clob_xpath ON purchaseorder_clob (OBJECT_VALUE)
INDEXTYPE IS CTXSYS.ctxxpath;
具体的索引参数请查阅ORACLE XML DB Developer's Guide以及 Oracle Text Application Developer's Guide .
注:使用这种索引的时候一定要完全遵循existsnode函数的语法,稍有不慎,ORACLE就会不使用索引,对表做一次全扫描。新建这种索引会在索引所在的用户下,出现4个新表,这四个新表实际上就是索引。
四 全文索引
其实全文索引有四种,CTXXPATH是完全针对XML的索引,而其他三种索引可以用于任何文本的索引,使用方法类似于CTXXPATH索引,只是需要修改索引类型和参数字符串。
Eg:CREATE INDEX purchaseorder_clob_xpath ON purchaseorder_clob (OBJECT_VALUE)
INDEXTYPE IS CTXSYS.CONTEXT;
而具体的查询语句则需要改写成:
SELECT DISTINCT
extractValue(OBJECT_VALUE,
'/PurchaseOrder/ShippingInstructions/address') "Address"
FROM purchaseorder
WHERE
contains(OBJECT_VALUE,
'$(Fortieth) INPATH(PurchaseOrder/ShippingInstructions/address)')
> 0;
需要注意的是,这种索引是一种静态索引,不能实时更新,需要定时运行存储过程来更新,而且这种索引对于汉语的支持并不好,我们在使用的时候发现了好几个功能性的BUG,因此并不建议使用。当然ORACLE 中文词法分析器的问题似乎不少,以后再说这方面的问题。
五 XMLINDEX
XMLINDEX是从ORACLE 10.2版以后出现的,针对XQUERY的索引结构。
Eg:CREATE INDEX purchaseorder_xmlindex ON purchaseorder (OBJECT_VALUE)
INDEXTYPE IS XDB.XMLINDEX;
其实一直没有测试XMLINDEX的效率,只是从文档上看到说11g里的XMLINDEX得到了空前加强,也不知道到底加强到什么程度了。
一些进展
1 周前
没有评论:
发表评论