代码之家  ›  专栏  ›  技术社区  ›  Rafael Winterhalter

对xmltable的列查询使用xmlIndex

  •  1
  • Rafael Winterhalter  · 技术社区  · 7 年前

    我想知道是否有办法让甲骨文使用 XMLIndex 当属性解析为表的列时。例如,以下代码将使用 XMLDEX 我已经指定了,但是如果我指定了列名,它将不起作用:

    SELECT *
    FROM mytable, XMLTABLE(
      '/foo' PASSING PAYLOAD COLUMNS
      res PATH './bar/text()'
    ) 
    -- where res = 'abc';
    where XMLExists('/foo/bar/text()="abc"]' PASSING PAYLOAD)
    

    我想定义具有许多列的此类表的视图,这些列应该易于查询。目前,我通过直接使用物化视图和索引列来解决问题,但我更喜欢使用 XMLDEX .

    1 回复  |  直到 7 年前
        1
  •  1
  •   Arkadiusz Łukasiewicz    7 年前

    有关更多详细信息,请访问 Structured Component to an XMLIndex Index . 这里有个小例子。

    1)准备试验结构。

    create table xindex_example(a number, b xmltype);
    
    insert into xindex_example values(1,xmltype('<root><x>
    <a>1</a>
    <b>2</b>
    </x>
    </root>'));
    

    2)使用参数创建xmlindex。

    CREATE INDEX xindex_example_idx ON xindex_example (b) INDEXTYPE IS XDB.XMLIndex
      PARAMETERS (q'~XMLTable my_test_group_tab
                     '/root/x'
                     columns a_val number path './a' ,  b_val number path './b'~');
    
      ;
    

    oracale自动创建表my_test_group_选项卡,但不能直接从该表进行查询。( ORA-30967: operation directly on the Path Table is disallowed )

    您可以通过“描述我的测试组”选项卡查看结构。

    3)在创建表上创建B+树索引

    create index my_test_group_tab_idx on my_test_group_tab(a_val);
    

    4)并进行测试。

      select * from (
      select x.* from xindex_example,xmltable('/root/x' passing b columns a_val number path './a' ,  b_val number path './b') x)
      where a_val=1;
    

    5)执行计划:

    -----------------------------------------------------------------------------------------------------
    | Id  | Operation                    | Name                  | Rows  | Bytes | Cost (%CPU)| Time     |
    ------------------------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT             |                       |     1 |    50 |     3   (0)| 00:00:01 |
    |   1 |  NESTED LOOPS                |                       |     1 |    50 |     3   (0)| 00:00:01 |
    |   2 |   TABLE ACCESS BY INDEX ROWID| MY_TEST_GROUP_TAB     |     1 |    38 |     2   (0)| 00:00:01 |
    |*  3 |    INDEX RANGE SCAN          | MY_TEST_GROUP_TAB_IDX |     1 |       |     1   (0)| 00:00:01 |
    |   4 |   TABLE ACCESS BY USER ROWID | XINDEX_EXAMPLE        |     1 |    12 |     1   (0)| 00:00:01 |
    ------------------------------------------------------------------------------------------------------