Оптимизация массовой вставки данных xml в postgresql 9.6 - PullRequest
0 голосов
/ 15 ноября 2018

В настоящее время я оптимизирую синтаксический анализатор xml, где у меня есть узкое место при массовой вставке 10 000 записей в массив xml в postgres.Эта версия postgres не поддерживает xmltable.Следующий код - это то, что у меня сейчас есть:

create unlogged table xmltable(
 xml_element1 xml[],
 xml_element2 xml[],
 xml_element3 xml[]
);

v_xml := XMLPARSE(DOCUMENT convert_from(src_blob, 'UTF8') );

INSERT INTO xmltable ( xml_element1, xml_element2, xml_element3)
     SELECT 
         (xpath ('element1parent/element1feature', x_xml)),
         (xpath ('element2parent/element2feature', x_xml)),
         (xpath ('element3parent/element3feature', x_xml)),
     FROM (SELECT unnest(xpath('/Root/grandparent',v_xml)) as x_xml);

drop table xmltable;


Current processing time is about 4 minutes for xml_element1 = 40 inserts, 
xml_element2 = 9,980 inserts, xml_element3 = 0 inserts.

Несколько вещей, которые я пробовал:

Переключение между временной и незарегистрированной таблицей. Разбиение запроса с помощью v_xml: = convert_from (src_blob,'UTF8') :: xml

Любое понимание будет с благодарностью!

1 Ответ

0 голосов
/ 15 ноября 2018

Я понял, функция unnest не нужна и накапливает много накладных расходов.

Это было намного быстрее:

INSERT INTO xmltable ( xml_element1, xml_element2, xml_element3)
 SELECT 
     (xpath ('/Root/grandparent/element1parent/element1feature', v_xml)),
     (xpath ('/Root/grandparent/element2parent/element2feature', v_xml)),
     (xpath ('/Root/grandparent/element3parent/element3feature', v_xml));
...