powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / XMLTABLE при поиске по индексированным полям
8 сообщений из 8, страница 1 из 1
XMLTABLE при поиске по индексированным полям
    #39553743
Popipo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый вечер, проблема в следующем. Имеется таблица с данными
Код: plsql
1.
2.
3.
4.
5.
create table A(
  entity VARCHAR2(25)
);
insert into A values('555');
commit;


Нужно найти среди некоторых значений те, которые существуют в данной таблице, делаю так
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
WITH data AS (SELECT * FROM XMLTABLE('/m/r'
            PASSING XMLTYPE('<m>
    <r><e>555</e></r>
    <r><e>1</e></r>
    <r><e>2</e></r>
    <r><e>3</e></r>
</m>') COLUMNS entity VARCHAR2(25) PATH 'e')
)              
SELECT entity FROM data d 
WHERE exists(
     SELECT 1 FROM A a where d.entity = a.entity
);


Результат как и ожидается верный, 555. Но моя таблица индексирована
Код: plsql
1.
create index a_idx on A(entity);


И тут начинаются проблемы, из-за индекса в ответ уже попадают все значения из xml таблицы(то есть 555, 1, 2, 3), но если оттуда убрать 555, то результат будет уже пуст. То есть хотя бы 1 попадающее значение тащит туда сразу все данные из xml таблицы.
Если слегка изменить запрос на
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
WITH data AS (SELECT * FROM XMLTABLE('/m/r'
            PASSING XMLTYPE('<m>
    <r><e>555</e></r>
    <r><e>1</e></r>
    <r><e>2</e></r>
    <r><e>3</e></r>
</m>') COLUMNS entity VARCHAR2(25) PATH 'e')
)              
SELECT distinct d.entity FROM data d, A a where d.entity = a.entity  


вернут уже правильный результат, но данный запрос не хочется использовать из-за того, что данных в таблице много и мне важен факт присутствия записи в таблице, а не их количество. Тут кроется проблема в совместном использовании exists, XMLTABLE и индексированого поля, но поиск в интернете ничего не дал. Может кто-нибудь подсказать как решить данную проблему?
...
Рейтинг: 0 / 0
XMLTABLE при поиске по индексированным полям
    #39553760
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Popipo,

Посмотри на планы с индексом и без. Возможно прокатит /*+ NO_XML_QUERY_REWRITE */
У себя на 11.2.0.4 воспроизвести не смог.
...
Рейтинг: 0 / 0
XMLTABLE при поиске по индексированным полям
    #39553777
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Popipo,

если материализовать data, будет тож самое?

.....
stax
...
Рейтинг: 0 / 0
XMLTABLE при поиске по индексированным полям
    #39553786
Popipo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Версия та же Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
хинт не изменил результат
По тестпланам ничего определенного не видно.
Нашел решение с заменой таблицы на
Код: plsql
1.
WITH data AS (SELECT column_value as entity from TABLE(SYS.DBMS_DEBUG_VC2COLL('555', '1', '2', '3')))  


Но в будущем возможно потребуется использовать больше 1 столбца, буду благодарен если кто-то найдет решение.
P.S. можно ли как-то врубить полное дебажное логгирование по запросу?
...
Рейтинг: 0 / 0
XMLTABLE при поиске по индексированным полям
    #39553787
Теоретик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PopipoТут кроется проблема в совместном использовании exists, XMLTABLE и индексированого поля

Бред.
...
Рейтинг: 0 / 0
XMLTABLE при поиске по индексированным полям
    #39553796
Popipo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
если материализовать data, будет тож самое?
Ух ты, хинт /*+ materialize */
Код: plsql
1.
 WITH data AS (SELECT /*+ materialize */* FROM XMLTABLE('/m/r'


починил запрос, выдает 555. Видимо оптимизация ORACLE решила что-то сделать с парсингом. Спасибо за решение
...
Рейтинг: 0 / 0
XMLTABLE при поиске по индексированным полям
    #39553801
Popipo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ТеоретикPopipoТут кроется проблема в совместном использовании exists, XMLTABLE и индексированого поля

Бред.
Я всего лишь делаю выводы основываясь на фактах, если избавится от XMLTABLE, дропнуть индекс или использовать distinct + join то все работает корректно
...
Рейтинг: 0 / 0
XMLTABLE при поиске по индексированным полям
    #39553802
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Теоретик,

почему бред, факт

всключены какие-то опции для хмл, вот и оптимизатору снесло крышу

ps
выдало enable XMLOptimizationCheck for more information

.....
stax
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / XMLTABLE при поиске по индексированным полям
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]