Используйте XMLIndex в запросах столбцов XMLTable - PullRequest
0 голосов
/ 20 ноября 2018

Мне интересно, есть ли способ заставить Oracle использовать XMLIndex для свойства, когда свойство разрешается как столбец таблицы.Например, следующий код будет использовать XMLIndex, который я указал, но он не будет делать то же самое, если я укажу имя столбца:

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

Я хотел бы определить представления таких таблиц со многимистолбцы, которые должны быть легко запрашивать.В настоящее время я работаю, используя материализованные представления и непосредственно индексируя столбцы, но я бы очень предпочел решение, которое использует XMLIndex.

1 Ответ

0 голосов
/ 20 ноября 2018

Для более подробной информации Google для 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_tab, но вы не можете выполнить запрос из этой таблицы напрямую.(ORA-30967: operation directly on the Path Table is disallowed)

Вы можете сделать desc my_test_group_tab, чтобы увидеть структуру.

3) Создайте индекс b + tree для таблицы создания

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 |
------------------------------------------------------------------------------------------------------
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...