Форум: "Базы";
Текущий архив: 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.005 c