基于xml属性的Oracle xmltype列索引

时间:2013-03-14 04:09:02

标签: oracle indexing xmltype xmlindex oracle-xml-db

我正在为xmltype列使用结构化存储类型。我试图在属性上创建一个索引,但不知何故Oracle没有采用索引并进行全表扫描。我已在http://docs.oracle.com/cd/B28359_01/appdev.111/b28369/xdb_indexing.htm#CHDCJIJB检查了文档,但它没有给出关于在属性上创建索引的示例。 有人可以给我一个在属性上创建xml索引的例子吗?

由于 凯文

1 个答案:

答案 0 :(得分:4)

你需要在这里显示一些代码。

这是在属性(及其后代节点)上创建xmlindex的示例:

SQL> create table xmltest ( a xmltype);

Table created.

SQL> insert into xmltest values ('<root>
  2   <a test="foo" test2="asd">
  3     <b>hi</b>
  4   </a>
  5   <a test="foo2" test2="asd2">hi</a>
  6  </root>');

1 row created.

SQL> commit;

Commit complete.

SQL> create index test_xmlindex on xmltest (a)
  2  indextype is XDB.XMLIndex
  3  parameters ('paths (include (/root/a/@test))');

Index created.

SQL> set pagesize 100 lines 200 heading off
SQL> explain plan for select * from xmltest where xmlexists('/root/a[@test="foo"]' passing a);

Explained.

SQL> select * from table(dbms_xplan.display());

Plan hash value: 2925043098

-------------------------------------------------------------------------------------------------------------------
| Id  | Operation                        | Name                           | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                 |                                |     1 |  2026 |     6  (17)| 00:00:01 |
|   1 |  NESTED LOOPS                    |                                |     1 |  2026 |     6  (17)| 00:00:01 |
|   2 |   VIEW                           | VW_SQ_1                        |     1 |    12 |     4   (0)| 00:00:01 |
|   3 |    HASH UNIQUE                   |                                |     1 |  5046 |            |          |
|   4 |     NESTED LOOPS                 |                                |       |       |            |          |
|   5 |      NESTED LOOPS                |                                |     1 |  5046 |     4   (0)| 00:00:01 |
|*  6 |       TABLE ACCESS BY INDEX ROWID| SYS82641_TEST_XMLIN_PATH_TABLE |     1 |  3524 |     2   (0)| 00:00:01 |
|*  7 |        INDEX RANGE SCAN          | SYS82641_TEST_XMLIN_VALUE_IX   |     1 |       |     1   (0)| 00:00:01 |
|*  8 |       INDEX RANGE SCAN           | SYS82641_TEST_XMLIN_PIKEY_IX   |     1 |       |     1   (0)| 00:00:01 |
|*  9 |      TABLE ACCESS BY INDEX ROWID | SYS82641_TEST_XMLIN_PATH_TABLE |     1 |  1522 |     2   (0)| 00:00:01 |
|  10 |   TABLE ACCESS BY USER ROWID     | XMLTEST                        |     1 |  2014 |     1   (0)| 00:00:01 |
-------------------------------------------------------------------------------------------------------------------

通过索引paths (include (/root/a/@test)),它将在索引中包含子<b>节点,但不包含test2属性。省略/@test也会使索引获取test2属性。