ExtractValue очень медленная обработка XML и синтаксический анализ в MySQL - PullRequest
0 голосов
/ 11 мая 2018

Мы обрабатываем большое количество XML, используя ExtractValue (xml, xpath) и цикл в нашем XML. например ExtractValue (p_xml, concat (xpath, '/ ROOT / TABLE [0] /')),

While (20k)
 INSERT INTO select_keys(key)
 Values (ExtractValue(p_xml, concat(xpath,'key',[counter])));
End While

Обработка XML в таблице данных становится ужасно медленной, если количество строк превышает тысячи.

CALL `MT_PROC`
(181, 0, '<ROOT></ROOT>', '<ROOT>
<TABLE><keys>f5d29464-e941-4cdf-a21b-984add68dce9</keys></TABLE>
<TABLE><keys>731d23a1-0438-4f72-91a5-83288f6e93b4</keys></TABLE>
<TABLE><keys>c68a4fb8-6306-4728-8b55-f26a151ffad4</keys></TABLE>
<TABLE><keys>3f5ec4bb-2109-4876-a419-b07b553081cc</keys></TABLE>
<TABLE><keys>4689bc20-9eec-4f6b-a454-9a30b7080cc2</keys></TABLE>
<TABLE><keys>466a7da5-7a9e-419f-b1fc-dcd57931a095</keys></TABLE>
....20K rows
</ROOT>') 

Каково решение этой проблемы.

1 Ответ

0 голосов
/ 11 мая 2018

Более быстрая обработка XML с прямыми вставками вместо ExtractValue.Используйте запрос для прямой вставки данных в таблицу, как показано ниже.

if p_xml is not null and p_xml <> '<ROOT></ROOT>' 
        then
            /*set CountMAX  = ExtractValue(p_xml, 'count(/ROOT/TABLE)');
            set Counter=1;

                while(Counter<=CountMAX) DO
                set xpath=concat('/ROOT/TABLE[',Counter,']/');
                    -- inserting values into the temp table
                    INSERT INTO select_keys(report_key)   Values (
                    ExtractValue(p_xml, concat(xpath,'report_key'))
                     );
                set Counter = Counter + 1;
               END WHILE;
               */               
    set p_xml = replace(replace(p_xml,'<TABLE><report_key>','('''),'</report_key></TABLE>','''),');            
    set p_xml = replace(replace(p_xml,'<ROOT>',''),',</ROOT>','');

    set @stmt_str = concat('INSERT INTO select_keys(report_key) values ' ,p_xml);
    prepare stmt from @stmt_str;
    execute stmt;
    deallocate prepare stmt;
END If;

enter image description here

...