oracle-databaseindexingxmltypexmlindexoracle-xml-db

Oracle xmltype column indexing based on xml attribute


I am using structured storage type for xmltype column. I am trying to create an index on the attribute but somehow Oracle is not taking the index and doing a full table scan. I have checked the documentation at http://docs.oracle.com/cd/B28359_01/appdev.111/b28369/xdb_indexing.htm#CHDCJIJB but it doesnot give an example on creating index on attribute. Can someone please give me an example of creating the xml index on attribute?

Thanks Kevin


Solution

  • you'd need to show some code here.

    here's an example of creating an xmlindex on an attribute (and its descendant nodes):

    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 |
    -------------------------------------------------------------------------------------------------------------------
    

    by indexing paths (include (/root/a/@test)) it would contain the child <b> node in the index but not the test2 attribute. ommitting /@test would have the index pick up the test2 attribute as well.