Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.01.06;
Скачать: CL | DM;

Вниз

Самый быстрый способ разобрать XML в оракл ?   Найти похожие ветки 

 
ANB ©   (2007-08-28 12:49) [0]

Значится, написал тестовый скриптик по разбору файлика с помощью xmltype (оракл 9.2).
На маленьком файлике в 17 метров работает 50 минут.
Это очень медленно, т.к. даже существующая полная обработка (с ползанием по базе и проверками), реализованная в 3 этапа и через заднепроходное отверстие, успевает обработать его за 32 минуты.
Кто нибудь может посоветовать что-нибудь пошустрее (желательно на PL/SQL) ?


 
ANB ©   (2007-08-28 12:50) [1]

Собственно, скрипт, для примера :

declare
  type T_esid_count is table of integer
     index by varchar2 (1000);

  V_esid_count       T_esid_count;
  V_esid_index       varchar2 (1000);
  V_esID             xmltype;
  V_esid_name        varchar2 (1000);
  V_transinfolist    xmltype;
  V_transinfo        xmltype;
  V_transinfo_name   varchar2 (1000);
begin
  dbms_output.enable (1000000);
  dbms_output.Put_line ("Start "
                        || to_char (sysdate, "DD.MM.YYYY HH24:MI:SS")
                       );

  for R in
     (select X.Column_value.extract ("/*") EsID
        from table (xmlsequence (xmltype ((select F.value
                                             from Test_clob F
                                            where F.id = :File_ID)).extract
                                                                      ("/*/*")
                                )
                   ) X)
  loop
     V_esID := R.EsID;
     V_esid_name := upper (xmltype (V_esID.Getclobval ()).Getrootelement ());

     if V_esid_name = "ED211"
     then
        -- Âûòÿíåì TransInfo
        for R_ti in (select X.Column_value.extract ("/*") Transinfo
                       from table (xmlsequence (V_esID.extract ("/*/*"))) X)
        loop
           V_transinfo := R_ti.Transinfo;
           V_transinfo_name := V_esid_name || "_TransInfo";

           if not V_esid_count.exists (V_transinfo_name)
           then
              V_esid_count (V_transinfo_name) := 0;
           end if;

           V_esid_count (V_transinfo_name) :=
                                           V_esid_count (V_transinfo_name)
                                           + 1;
        end loop;
     end if;

     -- extractvalue (Xr.Esidrec, "/*/@EDNo") Edno,
     if not V_esid_count.exists (V_esid_name)
     then
        V_esid_count (V_esid_name) := 0;
     end if;

     V_esid_count (V_esid_name) := V_esid_count (V_esid_name) + 1;
     V_esID := null;
     dbms_session.Free_unused_user_memory;
  end loop;

  V_esid_index := V_esid_count.first;

  while V_esid_index is not null
  loop
     dbms_output.Put_line (V_esid_index || " = "
                           || V_esid_count (V_esid_index)
                          );
     V_esid_index := V_esid_count.next (V_esid_index);
  end loop;

  dbms_output.Put_line ("End " || to_char (sysdate, "DD.MM.YYYY HH24:MI:SS"));
end;


 
Кщд ©   (2007-08-28 14:05) [2]

17мб для oracle"ового парсера - это не "маленький" файл...
как альтернатива - строить контекстный индекс

можно взглянуть на тайминги с dbms_session.Free_unused_user_memory и без него?


 
beg   (2007-08-28 14:07) [3]

и ещё, хотя, Вы это и знаете
коли возникает необходимость часто обрабатывать большие xml, то, возможно, их и хранить в уже сериализованном виде?


 
ANB ©   (2007-08-28 14:47) [4]


> коли возникает необходимость часто обрабатывать большие
> xml, то, возможно, их и хранить в уже сериализованном виде?
>

На сериализацию время уйдет - это импорт файла. я просто для удобства его в клоб запихал, чтобы с клиента каждый раз не тянуть. В реале будет просто параметр клобовый в хранимке. Если таки решим так делать.

Сейчас попробую без освобождения ресурсов - просто в начальном варианте падало по ошибке нехватки памяти.


 
Reindeer Moss Eater ©   (2007-08-28 15:19) [5]

А если файл совать не в клоб, а в родной xmltype ?


 
ANB ©   (2007-08-28 16:06) [6]

С почисткой :
Start 27.08.2007 18:48:10
ED206 = 5914
ED211 = 2
ED211_TransInfo = 55295
End 27.08.2007 19:40:22

С закоментаренной почисткой :
Start 28.08.2007 17:08:29
ED206 = 5914
ED211 = 2
ED211_TransInfo = 55295
End 28.08.2007 17:54:11

Вывод - эффекта нету.


> А если файл совать не в клоб, а в родной xmltype ?

Ща попробую, но скорее всего толку не будет.
Тем более сразу в XMLTYPE файл ничем не запихать - все равно придется из клоба преобразовывать.
Да и плохо стыкуется поле XMLTYPE с его функциями. Не всегда понимает.


 
Кщд ©   (2007-08-29 05:02) [7]

>ANB ©   (28.08.07 16:06) [6]
вдогонку
использование xmltype под 9-кой - чревато
не рискуя нарваться на очередную серьезную дырку oracle, начинать использовать xmltype можно с 10-ки (с устойчивого релиза. напр., 10.2)
имхо, конечно

если не сложно, сообщите, пожалуйста, чем завершится эпопея
с context индексами не пробовали?


 
beg   (2007-08-29 05:04) [8]

>Reindeer Moss Eater ©   (28.08.07 15:19) [5]
жаль получить проблемы при exp/imp из-за одного поля


 
beg   (2007-08-29 05:05) [9]

>beg   (29.08.07 05:04) [8]
>Кщд ©   (29.08.07 05:02) [7]
прошу прощения за путаницу с никами


 
Desdechado ©   (2007-08-29 10:48) [10]

> использование xmltype под 9-кой - чревато
> не рискуя нарваться на очередную серьезную дырку oracle,
Поподробнее можно?


 
ANB ©   (2007-08-29 16:46) [11]


> Поподробнее можно?

GetClobVal() не отрабатывает на форматированном SQL.

Эпопея кончилась ничем, решили оставить как есть, т.к. быстрее работает.


 
Desdechado ©   (2007-08-29 17:07) [12]

> > Поподробнее можно?
> GetClobVal() не отрабатывает на форматированном SQL.
Все равно мало что понял.
XMLTYPE пока не много юзал, но собираюсь больше и на 9-ке. И хотелось бы знать грабли в лицо, а не понаслышке.


 
Кщд ©   (2007-08-30 09:38) [13]

>Desdechado ©   (29.08.07 17:07) [12]
увы, баг-архив затерялся в дистрибах при переезде
но отчетливо помню несколько неоднотипных ORA-600 и весьма некрасивые workaround"ы к ним
когда найду, отпишусь конкретно



Страницы: 1 вся ветка

Текущий архив: 2008.01.06;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.008 c
4-1179382172
Pearled
2007-05-17 10:09
2008.01.06
Помогите с NetShareGetInfo()


4-1182069154
Nightmare
2007-06-17 12:32
2008.01.06
Рамка


2-1197145437
sdaf
2007-12-08 23:23
2008.01.06
Edit


15-1196611257
begin...end
2007-12-02 19:00
2008.01.06
Шоу двойников...


2-1197122711
Максим_В.
2007-12-08 17:05
2008.01.06
Пару вопросов про ооп