Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2008.01.06;
Скачать: [xml.tar.bz2];

Вниз

Самый быстрый способ разобрать 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.004 c
2-1197293417
kyn66
2007-12-10 16:30
2008.01.06
Рисование на канве Image


5-1164729857
Doma
2006-11-28 19:04
2008.01.06
Как узнать всех наследников TForm и TDataModule в проекте?


15-1196685094
ArtemESC
2007-12-03 15:31
2008.01.06
Новая больная идея!!!


3-1188392155
amily
2007-08-29 16:55
2008.01.06
как исправить DBF


15-1196672711
Kerk
2007-12-03 12:05
2008.01.06
Одно и то же в разных источниках





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский