oracle зависает при парсинге xml в колонке clob
От: ch_victor  
Дата: 04.02.23 16:53
Оценка:
Добрый день

имеется таблица со столбцом имеющим тип clob, в которой содержатся данные в формате xml
при попытке выборки запрос зависает, если размер clob больше 3.5 гигабайт, если меньше то
отрабатывает нормально
запрос вида

 select count(*)
   from FIAS_TEMP_TABLE t
      , XMLTABLE('/ITEMS/ITEM'
         PASSING xmltype(t.DATA_X)
           COLUMNS
            id          NUMBER(19)    PATH '@ID'
          , objectid    NUMBER(19)    PATH '@OBJECTID'
          , parentobjid NUMBER(19)    PATH '@PARENTOBJID'
          , changeid    NUMBER(19)    PATH '@CHANGEID'
          , regioncode  VARCHAR2(4)   PATH '@REGIONCODE'
          , areacode    VARCHAR2(4)   PATH '@AREACODE'
          , citycode    VARCHAR2(4)   PATH '@CITYCODE'
          , placecode   VARCHAR2(4)   PATH '@PLACECODE'
          , plancode    VARCHAR2(4)   PATH '@PLANCODE'
          , streetcode  VARCHAR2(4)   PATH '@STREETCODE'
          , previd      NUMBER(19)    PATH '@PREVID'
          , nextid      NUMBER(19)    PATH '@NEXTID'
          , updatedate  DATE          PATH '@UPDATEDATE'
          , startdate   DATE          PATH '@STARTDATE'
          , enddate     DATE          PATH '@ENDDATE'
          , isactive    NUMBER(1)     PATH '@ISACTIVE'
          , path        VARCHAR2(250) PATH '@PATH'
          ) xt
  where t.ID = 50


версия oracle 12.2.0.1
подскажите в чем может быть дело, как еще можно разобрать xml такого размера?
oracle sql xml
Re: oracle зависает при парсинге xml в колонке clob
От: Softwarer http://softwarer.ru
Дата: 04.02.23 18:31
Оценка: 2 (1)
Здравствуйте, ch_victor, Вы писали:

Я с этим разбирался во времена десятки. Сделал вывод, что движок использует для парсинга XML мало того, что жутко тормозящую реализацию на Java, так ещё вдобавок и DOM. Соответственно, когда она выйдет из строя — вопрос времени (ну а также доступной оперативки и нагрузки на сервер). В 12-й, думаю, ничего особенного не изменилось.

Общий вывод — оракловый XML вполне кошерно использовать для формирования выходных документов, но лучше не использовать для парсинга и манипуляций (разве что документы заведомо маленькие, впрочем, он и в этом случае с ними тормозит на пару порядков по сравнению с хорошими решениями). Ну а что касается ФИАС — парсить его не SAX-ом как бы изначально не очень вменяемая мысль.
Re: oracle зависает при парсинге xml в колонке clob
От: Слава  
Дата: 04.02.23 21:16
Оценка: 2 (1) +1
Здравствуйте, ch_victor, Вы писали:

_>имеется таблица со столбцом имеющим тип clob, в которой содержатся данные в формате xml

_>при попытке выборки запрос зависает, если размер clob больше 3.5 гигабайт, если меньше то
_>отрабатывает нормально

Дело в том, что не надо хранить данные такого размера в XML, не надо пытаться обрабатывать данные такого размера встроенными средствами чего бы то ни было, и уж тем более не надо это делать внутри БД.

Возможно стоит слегка забить болт на бизнес-задачи (возможно шуруп, и в голову постановщику задач, а также всем выше стоящим по иерархии) и заняться собственно программированием, рефакторингом. Чтобы вот такого в БД не было.
Re[2]: oracle зависает при парсинге xml в колонке clob
От: ch_victor  
Дата: 04.02.23 22:29
Оценка:
Здравствуйте, Softwarer, Вы писали:

S>Здравствуйте, ch_victor, Вы писали:


S>Я с этим разбирался во времена десятки. Сделал вывод, что движок использует для парсинга XML мало того, что жутко тормозящую реализацию на Java, так ещё вдобавок и DOM. Соответственно, когда она выйдет из строя — вопрос времени (ну а также доступной оперативки и нагрузки на сервер). В 12-й, думаю, ничего особенного не изменилось.


S>Общий вывод — оракловый XML вполне кошерно использовать для формирования выходных документов, но лучше не использовать для парсинга и манипуляций (разве что документы заведомо маленькие, впрочем, он и в этом случае с ними тормозит на пару порядков по сравнению с хорошими решениями). Ну а что касается ФИАС — парсить его не SAX-ом как бы изначально не очень вменяемая мысль.


у меня все работало когда тип поля в таблице был xmltype и данные туда загружались напрямую из файлов с помощью sqlldr, но на базе заказчика по какой то причине sqlldr не стал импортировать данные в xmltype в режиме DIRECT=TRUE, поэтому пришлось поменять тип столбца на clob, после этого импорт пошел

но дальше возникла проблема зависания при преобразовании clob в xmltype
чтобы использовать SAX я так понимаю надо писать процедуры парсинга на java и запускать их потом в pl/sql ? я пытался найти простой пример как это можно сделать, но что то ничего не нашел
Re[3]: oracle зависает при парсинге xml в колонке clob
От: wildwind Россия  
Дата: 07.02.23 15:31
Оценка: +3
Здравствуйте, ch_victor, Вы писали:

_>у меня все работало когда тип поля в таблице был xmltype и данные туда загружались напрямую из файлов с помощью sqlldr, но на базе заказчика по какой то причине sqlldr не стал импортировать данные в xmltype в режиме DIRECT=TRUE, поэтому пришлось поменять тип столбца на clob, после этого импорт пошел


При использовании xmltype документ парсится при загрузке и потом хитро индексируется. А при CLOB парсится при каждом запросе. Чувствуешь разницу? Даже без проблем с памятью за такое а-та-та делают.

Лучше разберитесь с лоадером и загрузите нормально.
Re: oracle зависает при парсинге xml в колонке clob
От: AndrewN Россия  
Дата: 06.03.23 12:50
Оценка:
Здравствуйте, ch_victor, Вы писали:

_>Добрый день

_>версия oracle 12.2.0.1
_>подскажите в чем может быть дело, как еще можно разобрать xml такого размера?

Судя по набору данных — это ГАР.
Там XML объемом суммарным под 400 Гигабайт (если распаковать 38 гиговый ZIP архив), никакой парсер (разве что SAX) такие объемы не потащит.

Я писал кастомный загрузчик ГАР в оракл, работал с этими XML файлами просто как с текстом, ибо формат файлов простой и заранее известный.
Нет никакой необходимости разбирать его именно как XML.
Я даже файлы для обработки напрямую из архива выуживаю, чтобы не распаковывать этого монстра.
--------------------------------------------------------------
Правильно заданный вопрос содержит в себе половину ответа
Отредактировано 06.03.2023 12:58 AndrewN . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.